Как программно заполнить субконто в проводках 1С при загрузке из Excel

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

При разработке механизмов загрузки данных из внешних источников, таких как Excel, программисты часто сталкиваются с задачей ручного формирования проводок. Одной из самых коварных частей этой задачи является заполнение аналитики — субконто. В отличие от обычных реквизитов, субконто представляют собой специальную коллекцию, и прямое присвоение значения переменной не всегда дает ожидаемый результат. В этой статье мы подробно разберем, как правильно обращаться к субконто, какие методы существуют и как избежать ситуации, когда документ записывается «пустым».

Понимание структуры субконто в 1С

Прежде всего, проанализируем ситуацию: субконто в регистре бухгалтерии — это не просто набор полей, а объект типа ХозрасчетныйСубконто (для бухгалтерского учета). Эта коллекция ведет себя как соответствие (Key-Value), где ключом выступает элемент ПланВидовХарактеристик.ВидыСубконтоХозрасчетные, а значением — ссылка на объект (справочник, документ и т.д.).

Рассмотрим основные способы программного заполнения этой коллекции, которые помогут нам в работе.

Способ 1. Обращение через коллекцию по ключу

Самый распространенный и надежный способ — это обращение к конкретному виду субконто через квадратные скобки. Для этого нам необходимо указать ссылку на вид субконто из соответствующего плана видов характеристик. Рассмотрим пример кода:


// НоваяСтрокаВРегистре — это запись регистра бухгалтерии
ВидСубкНоменклатура = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура;
НоваяСтрокаВРегистре.СубконтоДт[ВидСубкНоменклатура] = Справочники.Номенклатура.НайтиПоКоду(КодНоменклатуры);

Важный нюанс: в некоторых конфигурациях (особенно на обычных формах) система позволяет обращаться к субконто по имени, как к свойству: СубконтоДт.Номенклатура = Значение;. Однако этот способ менее универсален и может не сработать, если на счете не определен соответствующий вид субконто или если имена в конфигураторе настроены иначе. Использование явной ссылки из ПланыВидовХарактеристик — гораздо более безопасная практика.

Способ 2. Использование метода Вставить()

Поскольку коллекция субконто по своей сути является соответствием, мы можем использовать метод Вставить(). Это полезно, когда мы динамически определяем, какие виды аналитики нужно заполнить.


КлючСубконто = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты;
ЗначениеСубконто = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
НоваяСтрокаВРегистре.СубконтоДт.Вставить(КлючСубконто, ЗначениеСубконто);

Способ 3. Использование типовых процедур (БСП)

Если вы работаете в современной конфигурации на базе БСП (например, Бухгалтерия предприятия 3.0), рекомендуется использовать встроенные механизмы. Это гарантирует, что программа проверит, доступен ли данный вид субконто на выбранном счете, прежде чем пытаться записать данные.


// Пример использования общего модуля
БухгалтерскийУчет.УстановитьСубконто(НоваяСтрокаВРегистре.СчетДт, НоваяСтрокаВРегистре.СубконтоДт, "Номенклатура", ЗначениеНоменклатуры);

Разбор практической задачи: Загрузка из Excel в Набор Записей

Часто новички пытаются добавлять строки напрямую в движения документа через ДокументОбъект.Движения. Однако при работе с большим объемом данных (сотни и тысячи строк) из Excel эффективнее работать с Набором Записей регистра напрямую, привязав его к регистратору.

Проанализируем правильную последовательность действий при загрузке данных:

  1. Создаем новый документ-контейнер и записываем его, чтобы получить ссылку.
  2. Создаем объект РегистрБухгалтерииНаборЗаписей.
  3. Устанавливаем отбор по нашему документу (Регистратору).
  4. В цикле читаем Excel и добавляем записи в набор.
  5. Записываем весь набор целиком одной транзакцией.

Рассмотрим по шагам реализацию этого алгоритма:


// Создаем документ
НовыйДокумент = Документы.ОперацияБух.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Организация = ВыбраннаяОрганизация;
НовыйДокумент.Записать(); // Получаем Ссылку

// Работаем с набором записей
Проводки = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
Проводки.Отбор.Регистратор.Установить(НовыйДокумент.Ссылка);

Счет002 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("002");

Для НомерСтроки = 2 По КоличествоСтрок Цикл
    // Читаем данные из ячеек Excel
    КодНоменклатуры = Формат(Лист.Cells(НомерСтроки, 5).Value, "ЧГ=0");
    
    Проводка = Проводки.Добавить();
    Проводка.Регистратор = НовыйДокумент.Ссылка;
    Проводка.Период = НовыйДокумент.Дата;
    Проводка.Организация = НовыйДокумент.Организация;
    Проводка.СчетДт = Счет002;
    
    // Заполняем субконто через коллекцию
    Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура] = Справочники.Номенклатура.НайтиПоКоду(КодНоменклатуры);
    
    // Если нужно убрать лишние символы из строки Excel (например, апострофы)
    // Значение = СтрЗаменить(Лист.Cells(НомерСтроки, 3).Value, "'", "");
КонецЦикла;

Проводки.Записать();

Почему документ может оставаться пустым?

Выясним причину ситуации, когда при небольшом количестве строк код работает, а при увеличении (например, более 50 строк) данные в регистр не попадают. Разберем основные факторы риска:

  1. Типы данных в Excel: Если в колонке с кодами или числами попадается пустая ячейка или текст вместо числа, метод НайтиПоКоду вернет пустую ссылку. Если на счете данное субконто является обязательным, запись может пройти, но аналитика не отобразится.
  2. Ошибки в цикле: Если внутри цикла происходит исключение (ошибка), выполнение прерывается. Если вы используете попытку-исключение, ошибка может «проглотиться», и Проводки.Записать() не будет вызван.
  3. Метод записи: Обратите внимание, что метод Записать() без параметров перезаписывает все существующие движения по этому регистратору. Если в коде есть другие места, где меняются движения этого документа, они могут затереть ваш результат.
  4. Соответствие Организации: В регистрах бухгалтерии крайне важно, чтобы Организация в проводке совпадала с Организацией в документе. Если они отличаются, система может «не видеть» такие проводки в стандартных отчетах или формах.

Советы по оптимизации

Работа через COM-объект Excel.Application достаточно медленная. Если вам нужно загружать тысячи строк, попробуйте сохранить файл Excel в формате CSV или использовать чтение через ТабличныйДокумент. Это значительно ускорит процесс заполнения справочников и формирования проводок.

Также не забывайте закрывать процессы Excel после завершения работы, чтобы не перегружать память сервера:


Книга.Close(0);
Эксель.Quit();
Эксель = 0;

Соблюдение этих правил позволит вам создавать надежные и быстрые механизмы интеграции, корректно работающие с любыми разрезами бухгалтерского учета.

← На главную