В процессе работы с конфигурацией 1С:Бухгалтерия для Беларуси (редакция 2.1), которая по своей архитектуре схожа с 1С:Бухгалтерия предприятия 3.0, программисты и бухгалтеры часто сталкиваются с необходимостью детализации аналитики. Одной из таких задач является добавление субконто Склады на счет 94 «Недостачи и потери от порчи ценностей».
Сложность ситуации заключается в том, что стандартный документ ОтражениеНедостачи при проведении может не заполнять это субконто, если оно было добавлено пользователем самостоятельно в план счетов. Кроме того, часто требуется обновить данные в уже существующих (проведенных) документах, не меняя дату их проведения и не открывая период для редактирования. В этой статье мы подробно разберем, как решить эту задачу с помощью внешней обработки.
Для начала проанализируем, почему субконто не заполняется автоматически. В типовом плане счетов счет 94 обычно имеет аналитику по Номенклатуре и Партиям. Если вы добавили третье субконто Склады, программный модуль документа ОтражениеНедостачи просто «не видит» этого изменения. В коде формирования проводок жестко прописано заполнение только стандартных измерений.
Существует два пути решения:
ОбработкаПроведения или ПередЗаписью регистра бухгалтерии.Рассмотрим подробнее второй вариант, так как он позволяет исправить исторические данные без риска «развалить» последовательность документов.
Для реализации корректного заполнения аналитики нам необходимо выполнить следующие действия:
ОтражениеНедостачи, которые требуют корректировки.РегистрБухгалтерииНаборЗаписей.Хозрасчетный.Склады.Проанализируем ситуацию: склад в документе может находиться как в шапке (реквизит Склад), так и в табличной части. В документе ОтражениеНедостачи склад обычно указывается в шапке. Напишем простой запрос для получения этих данных:
ВЫБРАТЬ
ОтражениеНедостачи.Ссылка КАК Ссылка,
ОтражениеНедостачи.Склад КАК Склад
ИЗ
Документ.ОтражениеНедостачи КАК ОтражениеНедостачи
ГДЕ
ОтражениеНедостачи.Ссылка В (&МассивСсылок)
И ОтражениеНедостачи.Проведен = ИСТИНА
Этот запрос позволяет нам получить таблицу соответствия: какой склад должен быть подставлен для конкретного документа-регистратора.
Разберем самый важный этап — работу с регистром бухгалтерии. Чтобы изменить данные без перепроведения, мы будем использовать свойство ОбменДанными.Загрузка = Истина. Это критически важный момент: данный флаг отключает выполнение прикладных проверок и позволяет записывать данные «как есть».
Рассмотрим пример кода, который выполняет основную работу в цикле по результатам нашего запроса:
Для Каждого СтрокаДанных Из РезультатЗапроса Цикл
// Создаем набор записей регистра
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СтрокаДанных.Ссылка);
// Читаем существующие проводки документа из базы
НаборЗаписей.Прочитать();
Изменено = Ложь;
Для Каждого Проводка Из НаборЗаписей Цикл
// Нам нужно заполнить субконто на 94 счете.
// Проверяем счет по дебету и по кредиту
Если Проводка.СчетДт = ПланыСчетов.Хозрасчетный.НедостачиИПотериОтПорчиЦенностей Тогда
// Обращаемся к коллекции субконто по типу
ВидСубконтоСклады = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады;
Проводка.СубконтоДт[ВидСубконтоСклады] = СтрокаДанных.Склад;
Изменено = Истина;
КонецЕсли;
Если Проводка.СчетКт = ПланыСчетов.Хозрасчетный.НедостачиИПотериОтПорчиЦенностей Тогда
ВидСубконтоСклады = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады;
Проводка.СубконтоКт[ВидСубконтоСклады] = СтрокаДанных.Склад;
Изменено = Истина;
КонецЕсли;
КонецЦикла;
// Записываем изменения, если они были произведены
Если Изменено Тогда
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();
КонецЕсли;
КонецЦикла;
Выясним причину, почему нельзя просто написать Проводка.Субконто1 = Склад. В системе 1С субконто в регистре бухгалтерии реализованы не как обычные реквизиты, а как Карта (Map) или Соответствие. Ключом в этом соответствии является объект из плана видов характеристик ВидыСубконтоХозрасчетные, а значением — конкретный элемент справочника (в нашем случае — Склады).
Использование конструкции Проводка.СубконтоДт[ВидСубконтоСклады] гарантирует, что значение попадет именно в тот «слот» аналитики, который отведен под склады на данном счете, независимо от того, является он первым, вторым или третьим в списке.
Рассмотрим подробнее, что происходит при установке ОбменДанными.Загрузка = Истина:
ПередЗаписью и ПриЗаписи в модуле набора записей не будут выполнены (если в них нет специальной проверки флага загрузки).Внимание! При использовании этого метода данные в проводках изменятся, но в самом документе (в его экранной форме) значения могут остаться старыми, если там не предусмотрены соответствующие поля. Поэтому всегда следите за тем, чтобы данные в документе и в регистре были синхронизированы.
Чтобы не запускать обработку каждый раз, проанализируем возможность использования Подписки на событие. Мы можем создать расширение конфигурации и добавить подписку на событие ОбработкаПроведения документа ОтражениеНедостачи. В процедуре-обработчике подписки мы сможем дописать логику заполнения субконто 94 счета сразу в момент создания проводок системой.
Пример логики для подписки (в модуле расширения):
Процедура Расш1_ЗаполнитьСкладПередЗаписьюРегистра(Источник, Отказ, Замещение)
// Источник — это НаборЗаписей регистра бухгалтерии
// Находим склад через Регистратор
Если ТипЗнч(Источник.Отбор.Регистратор.Значение) = Тип("ДокументСсылка.ОтражениеНедостачи") Тогда
СкладДокумента = Источник.Отбор.Регистратор.Значение.Склад;
Для Каждого Запись Из Источник Цикл
Если Запись.СчетДт.Код = "94" Тогда
Запись.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады] = СкладДокумента;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Этот подход позволит системе «автомагически» заполнять аналитику при каждом проведении документа пользователем, избавляя вас от ручного труда и необходимости использования внешних обработок в будущем.