В 1C:EDT
страницаВ 1C:EDT
Закомментируйте в модуле формы добавленный вами текст и создайте обработчик события ПередЗаписью в модуле объекта Документ ВводНачальныхОстатковНоменклатуры.
Внесите в него следующий текст (листинг 22.2).
Листинг 22.2. Обработчик события «ПередЗаписью» модуля объекта
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Определить, нужно ли обновлять дату в движениях.
ОбновитьДатуДвижений = ЭтоНовый() ИЛИ Движения.ОстаткиМатериалов.Модифицированность();
Если Не ОбновитьДатуДвижений Тогда
// Проверить, что дата изменилась.
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ТекущийДокумент", Ссылка);
Запрос.Текст =
"ВЫБРАТЬ
| Дата
|ИЗ
| Документ.ВводНачальныхОстатковНоменклатуры
|ГДЕ
| Ссылка = &ТекущийДокумент";
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ОбновитьДатуДвижений = Выборка.Дата <> Дата;
КонецЕсли;
// Установить всем новую дату, если нужно.
Если ОбновитьДатуДвижений Тогда
Если НЕ Движения.ОстаткиМатериалов.Выбран() И НЕ Движения.ОстаткиМатериалов.Модифицированность() Тогда
Движения.ОстаткиМатериалов.Прочитать();
КонецЕсли;
Для Каждого ЗаписьРегистра Из Движения.ОстаткиМатериалов Цикл
ЗаписьРегистра.Период = Дата;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Как вы видите, в этом случае обработчик содержит больше кода за счет дополнительных проверок, которые выполняются в результате возможности как интерактивной, так и программной записи объекта.
Если записывается новый документ или были изменены его движения, следует обновить дату движений. В противном случае вы считываете запросом дату документа из базы данных и сравниваете ее с датой, установленной у записываемого объекта. Если даты разные, также следует обновить дату движений.
Перед установкой даты вы проверяете, был ли прочитан набор записей в свойстве Движения объекта и изменялся ли он. Если оба эти условия ложны, значит, набор записей в свойстве Движения объекта пуст и это состояние не связано с его изменением. В этом случае, чтобы предотвратить ошибочное удаление записей в регистре (перезапись пустым набором записей), вы предварительно читаете движения из регистра в набор записей в свойстве Движения.
Затем, как и в предыдущем случае (при записи из формы документа), вы устанавливаете нужную дату для всех записей этого набора. При выполнении записи объекта Документ этот набор будет записан в регистр накопления.