При разработке алгоритмов проведения документов или создании подписок на событие ОбработкаПроведения разработчики часто сталкиваются с ситуацией, когда проводки создаются, счета проставляются, но субконто остается пустым. Рассмотрим подробно причины этой проблемы и проанализируем, как правильно заполнять аналитику регистра бухгалтерии.
Проанализируем типичные ошибки, из-за которых аналитика на счете может не сохраняться в базе данных:
ТипЗнч() возвращает объект типа Тип, тогда как в качестве вида субконто платформа ожидает ссылку на элемент плана видов характеристик (например, ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные).ВидСубконто определяет тип аналитики (например, «Номенклатура» или «Контрагенты»), а Субконто — конкретное значение этой аналитики (например, конкретный товар или организация).ВидыСубконто соответствующего счета, платформа 1С проигнорирует его и не сохранит данные.Записать() у случайно созданного набора записей в процедуре проведения может приводить к сбоям транзакции или перезаписи данных автоматическими движениями документа.Для обращения к субконто конкретной проводки в платформе 1С используются специальные коллекции СубконтоДт и СубконтоКт. Присвоить значение аналитике можно двумя основными способами:
Вставить(), передав вид субконто и значение:
Движение.СубконтоДт.Вставить(ВидСубконто, ЗначениеСубконто);
Движение.СубконтоДт[ВидСубконто] = ЗначениеСубконто;
При работе в подписке на событие ОбработкаПроведения не следует создавать независимый набор записей через РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей(). Правильнее обращаться напрямую к коллекции движений документа, доступной через Источник.Движения.
Рассмотрим правильный шаблон заполнения проводок и аналитики в подписке на проведение:
// Получаем набор записей регистра бухгалтерии из источника
ДвиженияБУ = Источник.Движения.Хозрасчетный;
// Очищаем существующие движения или обходим их циклом
Для Каждого Движение Из ДвиженияБУ Цикл
// Назначаем счет дебета
Движение.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду(Источник.КоррСчет);
// Получаем вид субконто для данного счета
ВидСубконто1 = Движение.СчетДт.ВидыСубконто[0].ВидСубконто;
// Устанавливаем значение субконто по дебету
Движение.СубконтоДт.Вставить(ВидСубконто1, Источник.Субконто1);
КонецЦикла;
// Включаем флаг необходимости записи движений платформой
ДвиженияБУ.Записывать = Истина;
Если вы модифицируете уже записанные движения через создание независимого набора записей, обязательно убедитесь, что у объекта документа не остался флаг Записывать = Истина в его движениях, иначе системный механизм проведения перезапишет ваши изменения в конце транзакции.