Имя: Пароль:
1C
1С v8
Автоматическое изменение реквизита в документе и его перепроведение
0 lile4ka
 
09.04.15
12:40
Добрый день, уважаемые программисты :-)

При разработке конфигурации в 1С 8.2 столкнулась со следующей ситуацией. У меня есть документ "Заявка", в котором присутствует реквизит "Статус" со значениями, взятыми из перечислений "Назначен", "Выполняется", "Выполнено", "Не выполнено". Поскольку я новичок в этом деле и это моя первая разработка, все значения реквизитов для каждой заявки приходится менять вручную. Статус заявки при проведении документа фиксируется в соответствующем регистре сведений "Статус заявки".
Помимо этого с заявкой связаны документы "ЗаказМатериаловДляВыполненияУслуги" и "АктОказанияУслуг". Подскажите, пожалуйста, как сделать, чтобы при записи "Заказа материалов" (его движения ни в одном из созданных регистров не отражаются) движения документа "Заявка" перепизасывались с соответствующим изменением реквизита "Статус" на "Назначено", и при проведении док-та "Акт оказания услуг" (регистр накопления "Услуги") статус в док-те "Заявка" менялся на "Выполнено".
Вот модули объектов всех документов

Заявка: Процедура ОбработкаПроведения(Отказ, Режим)
// регистр СтатусЗаявки
Движения.СтатусЗаявки.Записывать = Истина;
Движение = Движения.СтатусЗаявки.Добавить();
Движение.СрокИсполнения = СрокИсполнения;
Движение.Исполнитель = Исполнитель;
Движение.Статус = Статус;
КонецПроцедуры

Заказ материалов для оказания услуги: Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаявкаНаОказаниеПлатныхУслуг") Тогда
Исполнитель = ДанныеЗаполнения.Исполнитель;
ДокументОснование = ДанныеЗаполнения.Ссылка;
Для Каждого ТекСтрокаТабличнаяЧасть1 Из ДанныеЗаполнения.ТабличнаяЧасть1 Цикл
НоваяСтрока = ТабличнаяЧасть1.Добавить();
НоваяСтрока.Услуга = ТекСтрокаТабличнаяЧасть1.ВидУслуги;
КонецЦикла;
ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаявкаНаОказаниеБесплатныхУслуг") Тогда
Исполнитель = ДанныеЗаполнения.Исполнитель;
ДокументОснование = ДанныеЗаполнения.Ссылка;
Для Каждого ТекСтрокаТабличнаяЧасть1 Из ДанныеЗаполнения.ТабличнаяЧасть1 Цикл
НоваяСтрока = ТабличнаяЧасть1.Добавить();
НоваяСтрока.Услуга = ТекСтрокаТабличнаяЧасть1.ВидУслуги;
КонецЦикла;
КонецЕсли;
КонецПроцедуры

Акт оказания услуг: Процедура ОбработкаПроведения(Отказ, Режим)
// регистр Услуги
Движения.Услуги.Записывать = Истина;
Для Каждого ТекСтрокаТабличнаяЧасть1 Из ТабличнаяЧасть1 Цикл
Движение = Движения.Услуги.Добавить();
Движение.Период = Дата;
Движение.ВидУслуги = ТекСтрокаТабличнаяЧасть1.ВидУслуги;
Движение.Исполнитель = Исполнитель;
Движение.Количество = ТекСтрокаТабличнаяЧасть1.Количество;
КонецЦикла;
КонецПроцедуры

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаявкаНаОказаниеПлатныхУслуг") Тогда
Инициатор = ДанныеЗаполнения.Заказчик;
Исполнитель = ДанныеЗаполнения.Исполнитель;
ДокументОснование = ДанныеЗаполнения.Ссылка;
Для Каждого ТекСтрокаТабличнаяЧасть1 Из ДанныеЗаполнения.ТабличнаяЧасть1 Цикл
НоваяСтрока = ТабличнаяЧасть1.Добавить();
НоваяСтрока.ВидУслуги = ТекСтрокаТабличнаяЧасть1.ВидУслуги;
НоваяСтрока.Количество = ТекСтрокаТабличнаяЧасть1.Количество;
КонецЦикла;
ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаявкаНаОказаниеБесплатныхУслуг") Тогда
Инициатор = ДанныеЗаполнения.Заказчик;
Исполнитель = ДанныеЗаполнения.Исполнитель;
ДокументОснование = ДанныеЗаполнения.Ссылка;
Для Каждого ТекСтрокаТабличнаяЧасть1 Из ДанныеЗаполнения.ТабличнаяЧасть1 Цикл
НоваяСтрока = ТабличнаяЧасть1.Добавить();
НоваяСтрока.ВидУслуги = ТекСтрокаТабличнаяЧасть1.ВидУслуги;
НоваяСтрока.Количество = ТекСтрокаТабличнаяЧасть1.Количество;
КонецЦикла;
КонецЕсли;

КонецПроцедуры

Спасибо! С уважением, грустный студент :-)
1 ИС-2
 
naïve
09.04.15
12:52
архитектура решения не правильная - каждый из документов должен менять статус в регистре СтатусЗаявки, где должно быть еще измерение Заявка и ресурс статус.

Если решать в лоб, то
В событие при записи документа "Заказа материалов" добавляем изменение документа (заявка.Статус = Назначено;)
и записываем заявку (Заявка.Записать(режимзаписидокумента.Проведение))
2 lile4ka
 
09.04.15
13:34
Заказ и Акт у меня вводятся на основании Заявки, точнее 2х разных "ЗаявкаНаОказаниеПлатныхУслуг" и "ЗаявкаНаОказаниеБесплатныхУслуг".
В Заказ и Акт я добавила также реквизит "Статус заявки" и сделала их регистраторами для регистра "Статус заявки". (хотя я так и не поняла, точно ли нужно его делать, ведь записи в регистре будут дублироваться...но как тогда по-другому сформировать движения этих 2х документов)

Затем, как я понимаю, нужно в обработку проведения заказа и акта впихнуть информацию о том, что мне нужно изменить статус заявок непосредственно в аналогичных документах.

Как это сделать - не представляю.
3 ДемонМаксвелла
 
09.04.15
13:39
тут не реквизит должен быть, а регистр сведений
4 ИС-2
 
naïve
09.04.15
13:45
ДокументОснование.Статус = Назначено;
ДокументОснование.Записать(режимзаписидокумента.проведение);

(3) +1
5 lile4ka
 
09.04.15
14:17
ДемонМаксвелла, не поняла Вас, поясните, пожалуйста, что нужно изменить.
6 lile4ka
 
09.04.15
14:18
ИС-2, возникает ошибка
{Документ.ЗаказМатериаловДляВыполненияУслуги.МодульОбъекта(36)}: Поле объекта недоступно для записи (Статус)
    ДокументОснование.Статус = СтатусЗаявки;
Что неверно сделано?
7 lile4ka
 
09.04.15
14:28
обработка заполнения Заказа
8 lile4ka
 
09.04.15
14:28
Процедура ОбработкаПроведения(Отказ, Режим)
    //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

    // регистр СтатусЗаявки
    Движения.СтатусЗаявки.Записывать = Истина;
    Движение = Движения.СтатусЗаявки.Добавить();
    Движение.Заявка = ДокументОснование;
    Движение.Статус = СтатусЗаявки;
    ДокументОснование.Статус = СтатусЗаявки;
ДокументОснование.Записать(режимзаписидокумента.проведение);


    //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

КонецПроцедуры
9 Ganiev
 
09.04.15
14:33
(4) правильно написал!
ДокОсн = ДокументОснование.ПолучитьОбъект();
ДокОсн.Статус = СтатусЗаявки;
ДокОсн.Записать(режимзаписидокумента.проведение);
10 lile4ka
 
09.04.15
14:51
Спасибо Вам огромное! Можно последний вопрос задать? )

По логике у меня и в заказе тогда должно установиться  "Выполнено".
Как правильно обратиться к документу "ЗаказМатериаловДляОказанияУслуги" в обработке проведения Акта?
в случае с заявкой я поняла, что мы объявляем переменную ДокОсн = ДокументОснование.ПолучитьОбъект();


Можно так?
Заказ = ДокументЗаказМатериаловДляОказанияУслуги.ПолучитьОбъект();

Или снова нагородила ошибок?
11 FIXXXL
 
09.04.15
15:09
(5) нужен РС с полями Заявка, ДокументИзмененияСтатуса, Статус
и все документы пишут туда инфо
затем срезом последних всегда можно получить актуальную инфо по статусу конкретной Заявки
12 FIXXXL
 
09.04.15
15:11
(11) +при открытии дока Заявки обновлять поле Статус на СтатусСрезПоследних, и не хранить этот реквизит в документе
13 lile4ka
 
09.04.15
15:21
FIXXXL, делаю этот РС периодическим, затем создаю общий модуль с функцией
14 lile4ka
 
09.04.15
15:22
Функция АктуальныйСтатус(АктуальнаяДата, ЭлементЗаявок) Экспорт
    Отбор=Новый Структура("Заявка",ЭлементЗаявок);
    ЗначенияРесурсов = РегистрыСведений.СтатусЗаявки.ПолучитьПоследнее(АктуальнаяДата, Отбор);
    Возврат ЗначенияРесурсов.Статус;
КонецФункции


Так верно?
15 lile4ka
 
09.04.15
15:38
Подскажите, пожалуйста, как при открытии дока Заявка обновлять поле Статус на СтатусСрезПоследних, и не хранить этот реквизит в документе?
16 Ganiev
 
10.04.15
08:39
Сделай экспортную Функцию ПолучитьСтатусДокументаНаДату(ДатаДок, ДокументОбъект) в общем модуле с параметрами дата и регистратор ,где запросом получаешь срез на дату срез с параметром отбора по регистратору. Сделай возврат полученного значения. После этого тебе не надо будет во всех документов писать запрос получения статуса, а достаточно вызвать твою функцию.

в процедуре ПриОткрытии() или ПередОткрытием()  вызови свою функцию что-то типа такого:
Статус = ПолучитьСтатусДокументаНаДату(ДатаДок, ЭтотОбъект.Ссылка)!