При разработке механизмов переноса данных или создании сложных инструментов загрузки проводок программисты часто сталкиваются с методом Загрузить() объекта РегистрБухгалтерииНаборЗаписей. Этот метод чрезвычайно эффективен, так как позволяет одним вызовом заполнить весь набор записей из предварительно подготовленной таблицы значений (ТЗ). Однако за высокую скорость приходится платить строгими требованиями к структуре и типам данных этой таблицы. Малейшее отклонение приводит к ошибке: «Ошибка при вызове метода контекста (Загрузить): В колонке вид субконто содержится значение неверного типа!».
Рассмотрим подробно причины возникновения этой ситуации и разберем по шагам, как правильно подготовить таблицу значений, чтобы загрузка прошла успешно.
Выясним первую и самую банальную причину, на которую часто не обращают внимания из-за «замыленного» взгляда. Проанализируем ситуацию: если в ТЗ колонка СчетДт или СчетКт заполнена строковыми значениями (кодами счетов, например, "000" или "62.01") вместо ссылок на ПланСчетовСсылка, метод Загрузить() выдаст ошибку типа. 1С не выполняет автоматическое преобразование строки в ссылку по коду при вызове этого метода.
Проверим, как создается ваша таблица значений. Если вы добавляете колонки вручную, обязательно указывайте ОписаниеТипов:
ОписаниеТипаСчета = Новый ОписаниеТипов("ПланСчетовСсылка.Хозрасчетный");
ТЗ.Колонки.Добавить("СчетДт", ОписаниеТипаСчета);
ТЗ.Колонки.Добавить("СчетКт", ОписаниеТипаСчета);
Если данные считываются из текстового файла или Excel, убедитесь, что перед помещением в ТЗ вы находите ссылку на счет методом НайтиПоКоду().
Самый коварный момент связан с колонками видов субконто (ВидСубконтоДт1, ВидСубконтоКт1 и так далее). Даже если выбранный счет (например, вспомогательный счет "000") не имеет субконто вовсе, эти колонки обязаны присутствовать в ТЗ, если они определены в структуре регистра. Рассмотрим основные правила их заполнения:
Загрузить() крайне негативно реагирует на значения Неопределено или NULL в колонках, предназначенных для видов субконто. Программа ожидает конкретный тип, определенный в Плане Видов Характеристик (ПВХ).ВидСубконтоДтХ необходимо записывать пустую ссылку этого ПВХ. Это критически важный момент, который решает большинство проблем.Посмотрим на пример правильного заполнения строки ТЗ для счета без субконто:
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.СчетКт = ПланыСчетов.Хозрасчетный.Вспомогательный; // Счет 000
// Даже если субконто нет, записываем пустую ссылку ПВХ:
НоваяСтрока.ВидСубконтоКт1 = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ПустаяСсылка();
НоваяСтрока.ВидСубконтоКт2 = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ПустаяСсылка();
НоваяСтрока.ВидСубконтоКт3 = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ПустаяСсылка();
Важно не путать колонку вида субконто (какой разрез учета используется) и колонку самого значения субконто (конкретный контрагент, договор или номенклатура). Проанализируем логику их совместного заполнения:
СубконтоДт1) должно быть значение Неопределено.Эта тонкая грань часто становится причиной ошибок при программном формировании проводок, так как разработчики пытаются подставить пустые ссылки везде, где это кажется логичным.
Чтобы избежать ошибок с именованием колонок или их порядком, крайне рекомендуется не создавать таблицу значений вручную через Новый ТаблицаЗначений. Вместо этого используем метод самого набора записей, который создаст идеальную структуру со всеми необходимыми типами данных.
Разберем этот алгоритм по шагам:
// 1. Создаем пустой набор записей
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
// 2. Выгружаем колонки набора в таблицу значений.
// Это создаст ТЗ со всеми служебными полями (Активность, Период, Регистратор и т.д.)
// и правильной типизацией всех ВидовСубконто и ЗначенийСубконто.
ТаблицаДляЗагрузки = НаборЗаписей.ВыгрузитьКолонки();
// 3. Заполняем таблицу данными
НоваяЗапись = ТаблицаДляЗагрузки.Добавить();
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.Регистратор = СсылкаНаДокумент;
НоваяЗапись.СчетДт = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
НоваяЗапись.ВидСубконтоДт1 = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура;
НоваяЗапись.СубконтоДт1 = СсылкаНаТовар;
// ... и так далее
// 4. Загружаем подготовленную таблицу в набор
НаборЗаписей.Загрузить(ТаблицаДляЗагрузки);
НаборЗаписей.Записать();
Помимо видов субконто, обратите внимание на следующие поля, отсутствие или неверный тип которых также может блокировать метод Загрузить():
Активность: Эта колонка должна иметь тип Булево. Если её не заполнить, записи могут загрузиться как «выключенные» (не влияющие на итоги), или система выдаст ошибку, если поле обязательно для заполнения.
Организация: В большинстве типовых решений Организация является балансовым измерением регистра бухгалтерии. Она должна быть заполнена корректной ссылкой во всех строках таблицы.
Количественный и валютный учет: Если вы загружаете проводки на счета, где ведется количественный или валютный учет, убедитесь, что колонки КоличествоДт, ВалютаДт, СуммаВалютнаяДт присутствуют в вашей ТЗ. Даже если учет по конкретной проводке не ведется, метод Загрузить() требует наличия этих колонок в структуре ТЗ, если они есть в регистре.
Таким образом, успех загрузки проводок через таблицу значений зависит от строгого соответствия типов. Используйте метод ВыгрузитьКолонки() для инициализации таблицы, заменяйте Неопределено на пустые ссылки ПВХ в колонках видов субконто и всегда проверяйте, что ссылки на счета получены корректно, а не остались строковыми представлениями.