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