В 1С:Предприятии 8 существует возможность организовать в форме редактирование пользователем записей любого регистра, в том числе, и для подчиненного регистратору. Данная возможность соответствует общему подходу, принятому в 1С:Предприятии 8 в отношении модификации записей регистров. Система допускает и программное, и интерактивное изменение записей регистра без какого-либо участия регистратора (документа). Для выполнения таких изменений достаточно указать только ссылку на регистратор, чтобы определить значение отбора записей регистра.
Следует заметить, что эта возможность никак не противоречит типовой стратегии формирования движений при проведении документов. Система допускает, наряду с основной стратегией, используемой в большинстве случаев и предполагающей формирование движений в процессе проведения, и другие варианты. Например, непосредственное изменение движений может использоваться для создания документов, предназначенных для ручного редактирования движений регистров. Такая возможность широко используется для регистров бухгалтерского учета, но может применяться и для других регистров. Это позволяет предоставить пользователю или администратору системы возможность отражения в регистре операций, для которых не предусмотрено в конфигурации специального документа. Такая возможность никак не нарушает общую модель использования регистра как централизованной системы учета, а позволяет решать в нем дополнительные, заранее не предусмотренные задачи. Другим вариантом использования ручного редактирования регистров может являться предоставление пользователю возможности вносить изменения в движения, сформированные документом (в форме документа или в отдельной форме). Разумеется, реализация такой возможности требует от разработчика конфигурации решения вопросов связанных с регулированием полномочий пользователя и возможностью повторного формирования движений документом после их ручной корректировки. Например, может отмечаться, что движения данного документа изменены вручную и не должны обновляться при проведении. Система предоставляет весь необходимый набор средств для поддержки таких решений (расширения табличного поля, предназначенные для редактирования наборов записей, возможность отключения активности записей, отключение автоматического удаления движений и т.д.) Соответственно, это решение может применяться разработчиком, если он считает необходимым наличие такой возможности в прикладном решении.
В качестве примера рассмотрим создание документа "РучнаяОперация" для изменения данных регистра "УчетНоменклатуры".
Прежде всего, следует запретить проведение документа "РучнаяОперация". Работа стандартного механизма проведения документов нам, в данном случае, будет не нужна, поскольку мы собираемся вручную изменять записи в регистре накопления.
Затем, несмотря на то, что документ "РучнаяОперация" не проводится, следует указать, что движения документа будут находиться в регистре накопления "УчетНоменклатуры". Это необходимо для того, чтобы в форме документа нам был доступен для редактирования набор записей регистра накопления, содержащий движения документа "РучнаяОперация". Данная ситуация как раз очень хорошо иллюстрирует тот факт, что изменение записей регистра может выполняться не только при проведении документа, но и другими способами.
После этого в форме документа "РучнаяОперация" следует расположить табличное поле с командной панелью. Тип значения этого табличного поля должен быть "РегистрНакопленияНаборЗаписей.УчетНоменклатуры". Затем следует указать, что источником данных для этого табличного поля будут являться движения документа "РучнаяОперация" по регистру "УчетНоменклатуры".
Все, по большому счету, ручная операция готова. Можно в режиме "1С:Предприятие" создать новый документ, и используя пиктограммы командной панели, связанной с табличным полем, вручную редактировать набор записей этого документа.
Обратите внимание, что при записи документа в качестве регистратора для редактируемого набора записей будет установлен сам этот документ (независимо от значения, введенного вручную), и для каждой записи из набора может быть указан различный период, не совпадающий с датой самого документа.
Также следует заметить, что при пометке документа на удаление движения не очищаются, поскольку мы не задействовали механизм проведения документа. В случае если необходима подобная функциональность, можно регулировать активность движений.
Таким образом, мы рассмотрели общий случай создания ручной операции. Однако логика конкретного прикладного решения может накладывать различные ограничения на создаваемую ручную операцию. Одним из самых распространенных ограничений является требование синхронизации даты движений с датой самого документа.
Самым простым способом такой синхронизации является принудительная установка нужной даты движений в модуле формы документа:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Для Каждого ЗаписьРегистра Из Движения.УчетНоменклатуры Цикл
ЗаписьРегистра.Период = Дата;
КонецЦикла;
КонецПроцедуры
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Определить нужно ли обновлять дату в движениях
ОбновитьДатуДвижений = ЭтоНовый() Или Движения.УчетНоменклатуры.Модифицированность();
Если Не ОбновитьДатуДвижений Тогда
// Проверить, что дата изменилась
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ТекущийДокумент", Ссылка);
Запрос.Текст =
"ВЫБРАТЬ
| Дата
|ИЗ
| Документ.ВводНачальныхОстатков
|ГДЕ Ссылка = &ТекущийДокумент";
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ОбновитьДатуДвижений = Выборка.Дата <> Дата;
КонецЕсли;
// Установить всем новую дату, если нужно
Если ОбновитьДатуДвижений Тогда
Если Не Движения.УчетНоменклатуры.Выбран() И Не Движения.УчетНоменклатуры.Модифицированность() Тогда
Движения.УчетНоменклатуры.Прочитать();
КонецЕсли;
Для Каждого ЗаписьРегистра Из Движения.УчетНоменклатуры Цикл
ЗаписьРегистра.Период = Дата;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua