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