При автоматизации загрузки банковских выписок в среде 1С:Предприятие 7.7 разработчики часто сталкиваются с необходимостью программного заполнения специфических документов, таких как РазноскаБанка. Одной из ключевых задач здесь является корректная установка признака движения денежных средств — Дебет или Кредит. На первый взгляд задача кажется тривиальной, однако она таит в себе подводные камни, связанные с типизацией данных и особенностями работы с табличными частями документов в "семерке".
В этой статье мы подробно разберем, как правильно обращаться к объектам метаданных, почему нельзя использовать строковые значения для реквизитов типа Перечисление и как избежать критических ошибок при открытии программно созданных документов.
Прежде всего, нам необходимо выяснить, что именно представляет собой реквизит ДебетКредит. В большинстве конфигураций 1С 7.7 (включая специализированные латвийские локализации) этот реквизит имеет тип Перечисление.ДебетКредит. Это не строка и не число, а специальный объект метаданных.
Рассмотрим типичную ошибку начинающего разработчика: попытку присвоить текстовое значение напрямую. Проанализируем ситуацию, когда программист пишет ДокБанк.ДебетКредит = "Дебет";. В 1С 7.7 такое присвоение приведет к тому, что в поле документа запишется строковый тип вместо ссылки на значение перечисления. В результате при попытке открыть форму документа или рассчитать итоги система выдаст ошибку, так как программный код модуля формы ожидает объект, а получает строку. Это часто становится причиной ошибки Переменная не определена (ИтогУ), так как алгоритмы расчета итогов в форме документа "спотыкаются" о некорректный тип данных.
Для того чтобы корректно установить значение, мы должны обратиться к глобальному агрегатному объекту Перечисления. Синтаксис выглядит следующим образом:
// Создаем объект документа
ДокБанк = СоздатьОбъект("Документ.РазноскаБанка");
ДокБанк.Новый();
// Устанавливаем значение реквизита правильно
ДокБанк.ДебетКредит = Перечисление.ДебетКредит.Дебет;
Если мы не уверены в точном идентификаторе значения (например, в локализованных версиях "Дебет" может называться "Debets"), нам следует открыть Конфигуратор, найти дерево метаданных, развернуть ветку Перечисления и посмотреть идентификаторы конкретных значений внутри перечисления ДебетКредит.
В документе РазноскаБанка реквизит выбора направления платежа чаще всего находится не в шапке документа, а в его табличной части. Это принципиально меняет подход к написанию кода. Мы не можем просто присвоить значение документу, не создав или не выбрав конкретную строку.
Разберем по шагам алгоритм заполнения табличной части при автоматической разноске:
НоваяСтрока().Записать().Посмотрим на пример кода, реализующий этот подход:
ДокБанк = СоздатьОбъект("Документ.РазноскаБанка");
ДокБанк.Новый();
ДокБанк.ДатаДок = ТекущаяДата();
// Начинаем цикл по данным из банковского файла
Пока ДанныеИзФайла.ПолучитьСтроку() = 1 Цикл
ДокБанк.НоваяСтрока();
// Определяем логику: Дебет или Кредит
Если ДанныеИзФайла.Сумма > 0 Тогда
ДокБанк.ДебетКредит = Перечисление.ДебетКредит.Дебет;
Иначе
ДокБанк.ДебетКредит = Перечисление.ДебетКредит.Кредит;
КонецЕсли;
ДокBank.Сумма = Абс(ДанныеИзФайла.Сумма);
ДокБанк.Содержание = "Автоматическая разноска";
КонецЦикла;
ДокБанк.Записать();
Если после программного создания документа вы получаете ошибку {Документ.РазноскаБанка.Форма.Модуль(18)}: Переменная не определена (ИтогУ), это означает, что в форме документа используются расчетные переменные, которые не были инициализированы. В 1С 7.7 существует разделение между Контекстом модуля документа и Контекстом модуля формы.
Проанализируем причину: когда вы открываете документ интерактивно, срабатывает процедура ПриОткрытии(), которая инициализирует переменные для итогов. При программном заполнении эти переменные могут остаться пустыми или иметь неверный тип, если данные в реквизитах (как в случае со строкой "Дебет") некорректны. Чтобы избежать подобных проблем, всегда проверяйте:
Итог("Сумма"), убедитесь, что все числовые поля заполнены числами, а не пустыми значениями.КоррСчет.В некоторых случаях, когда идентификаторы значений содержат спецсимволы или динамически определяются, можно использовать методы доступа по индексу или идентификатору. Это полезно, если вы пишете универсальную обработку импорта.
Рассмотрим способы получения значения перечисления без прямого обращения к идентификатору:
// Способ 1: Получение по порядковому номеру (индексу)
// Если "Дебет" идет первым в списке перечисления
НужноеЗначение = Перечисление.ДебетКредит.ЗначениеПоНомеру(1);
// Способ 2: Получение по строковому идентификатору из метаданных
ИмяЗначения = "Дебет";
НужноеЗначение = Перечисление.ДебетКредит.ЗначениеПоИдентификатору(ИмяЗначения);
// Теперь присваиваем
ДокБанк.ДебетКредит = НужноеЗначение;
Использование метода ЗначениеПоИдентификатору является наиболее безопасным при программной работе, так как позволяет избежать жесткого кодирования идентификаторов в тексте программы и дает возможность выносить настройки соответствий во внешние файлы или константы.
Для эффективной работы в конфигураторе 1С 7.7 рекомендуем использовать дополнительные инструменты, такие как OpenConf. Это расширение добавляет в старую среду разработки современные функции, такие как IntelliSense (подсказки кода). Нажав Ctrl + Space после точки, вы сможете увидеть список доступных значений перечисления, что исключит ошибки в написании идентификаторов.
Также всегда проверяйте структуру документа через Табло в режиме отладки. Остановив выполнение кода после строки присвоения, введите ТипЗначенияСтр(ДокБанк.ДебетКредит). Если система вернет "Перечисление", значит, вы всё сделали правильно. Если "Строка" — ищите ошибку в логике присвоения.
Подводя итог, можно сказать, что автоматическая разноска банка требует аккуратного обращения с типами данных 1С 7.7. Правильная последовательность действий — создание строки табличной части, обращение к глобальному объекту Перечисления и последующая запись объекта — гарантирует стабильную работу документа и отсутствие ошибок при его последующем открытии пользователем.