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