Мы рассмотрим распространенную проблему, с которой сталкиваются пользователи при обмене данными между iiko и 1С:Бухгалтерией (1С БП) через CSV-файлы. Часто при попытке загрузить выгруженные из iiko файлы в 1С с помощью внешней обработки, возникает ошибка "Неверное имя колонки". Выясним причины этой ошибки и предложим эффективные способы ее устранения.
Ошибка
Ошибка при вызове метода контекста (Добавить) {ВнешняяОбработка.Загрузка.Форма.Форма.Форма(13030)}:ТЗ.Колонки.Добавить(Стр); по причине: Неверное имя колонки
Мы обнаружили, что одной из наиболее частых причин ошибки "Неверное имя колонки" при загрузке CSV-файлов является несоответствие кодировок. Система iiko по умолчанию может выгружать файлы в кодировке UTF-8, в то время как внешняя обработка 1С, особенно старые или типовые решения, зачастую ожидает файлы в кодировке Windows-1251 (также известной как ANSI для русскоязычных систем).
Когда кодировки не совпадают, символы в начале файла или в именах колонок могут быть интерпретированы неправильно, что приводит к появлению "мусорных" символов или искажению названий. Например, символ "!" в UTF-8 при неправильной интерпретации в Windows-1251 может превратиться в несколько других, нечитаемых символов. Эти искаженные названия 1С не может распознать как допустимые имена колонок, что и вызывает ошибку "Неверное имя колонки".
UTF-8, это потенциальная причина проблемы.UTF-8 выберите Windows-1251 или ANSI. В некоторых случаях iiko может предлагать опцию, похожую на "windows-1231 или как то так", но корректная кодировка для русских символов в Windows-системах, с которой работает 1С, это Windows-1251.Даже после исправления кодировки, мы можем столкнуться с ошибкой "Неверное имя колонки", если в шапке CSV-файла присутствуют специальные символы (пробелы, скобки, точки, запятые, дефисы и т.д.) в названиях колонок. 1С имеет строгие правила для именования полей таблиц значений (ТаблицаЗначений) и других объектов. Такие символы часто недопустимы для использования в качестве идентификаторов в коде или в структуре объектов 1С.
Например, имя колонки "Акт реализации (с НДС)" может вызвать ошибку, так как скобки и пробелы не являются стандартными символами для идентификаторов в 1С. Система iiko формирует эти названия автоматически, поэтому изменить их напрямую через интерфейс iiko может быть невозможно.
Мы видим, что ошибка возникает в строке ТЗ.Колонки.Добавить(Стр);, что указывает на то, что обработка пытается добавить колонку в таблицу значений 1С с именем, полученным из CSV, но это имя признается некорректным.
Проанализируем пример строки из ошибки:
{ВнешняяОбработка.Загрузка.Форма.Форма.Форма(13030)}:ТЗ.Колонки.Добавить(Стр);
{ВнешняяОбработка.Загрузка.Форма.Форма.Форма(13006)}:СоздатьШапкуТЗ(МассивШапки,ТЗ);
{ВнешняяОбработка.Загрузка.Форма.Форма.Форма(2665)}:АдресАР = ПрочитатьФайлБезСтруктуры(Текст,КодировкаТекста.ANSI,"АР");
{ВнешняяОбработка.Загрузка.Форма.Форма.Форма(3176)}:ЗагрузитьДокументыИзФайлов;
{ВнешняяОбработка.Загрузка.Форма.Форма.Форма(3101)}:ЗагрузитьНажатиеФрагмент;
[ОшибкаВоВремяВыполненияВстроенногоЯзыка] по причине: Неверное имя колонки
[ОшибкаИспользованияВстроенногоЯзыка]
Здесь переменная Стр содержит имя колонки, которое система 1С считает недействительным. Последовательность вызовов функций (ПрочитатьФайлБезСтруктуры -> СоздатьШапкуТЗ -> ТЗ.Колонки.Добавить(Стр)) показывает нам, что проблема возникает на этапе формирования структуры таблицы значений 1С на основе заголовка CSV-файла.
ТаблицыЗначений. В данном случае, судя по ошибке, это функция СоздатьШапкуТЗ, которая вызывается из ПрочитатьФайлБезСтруктуры. Именно в этой функции или до ее вызова нам необходимо добавить логику обработки имени колонки.ТЗ.Колонки.Добавить(Стр);.СоздатьШапкуТЗ или в вызывающей ее функции до передачи имени колонки в ТЗ.Колонки.Добавить):
// ... часть кода внешней обработки, где Стр - имя колонки из файла
ПеременнаяСИменемКолонкиИзФайла = Стр; // Исходное имя колонки, например "Акт реализации (с НДС)"
// Инициализируем новое имя, которое будем очищать
ОчищенноеИмяКолонки = ПеременнаяСИменемКолонкиИзФайла;
// Удаляем пробелы
ОчищенноеИмяКолонки = СтрЗаменить(ОчищенноеИмяКолонки, " ", "");
// Удаляем скобки
ОчищенноеИмяКолонки = СтрЗаменить(ОчищенноеИмяКолонки, "(", "");
ОчищенноеИмяКолонки = СтрЗаменить(ОчищенноеИмяКолонки, ")", "");
// Удаляем другие возможные недопустимые символы (например, точки, запятые, дефисы)
ОчищенноеИмяКолонки = СтрЗаменить(ОчищенноеИмяКолонки, ".", "");
ОчищенноеИмяКолонки = СтрЗаменить(ОчищенноеИмяКолонки, ",", "");
ОчищенноеИмяКолонки = СтрЗаменить(ОчищенноеИмяКолонки, "-", "");
ОчищенноеИмяКолонки = СтрЗаменить(ОчищенноеИмяКолонки, "/", ""); // Если есть слеши
// Мы можем также привести имя к верхнему или нижнему регистру, если это требуется для стандартизации
// ОчищенноеИмяКолонки = ВРег(ОчищенноеИмяКолонки);
// Если необходимо, можем привести к CamelCase или другому стандарту,
// но в большинстве случаев простое удаление недопустимых символов достаточно для решения проблемы.
// Проверяем, не стало ли имя пустым или слишком коротким после очистки
Если СтрДлина(ОчищенноеИмяКолонки) = 0 Тогда
// Генерируем уникальное имя, чтобы избежать ошибок
ОчищенноеИмяКолонки = "КолонкаБезИмени" + Формат(ИндексТекущейКолонки, "ЧГ=0");
КонецЕсли;
// Добавляем колонку с очищенным именем в ТаблицуЗначений
ТЗ.Колонки.Добавить(ОчищенноеИмяКолонки);
// ...
ТаблицеЗначений должны быть уникальными. В таких случаях нам придется добавлять к очищенным именам уникальные суффиксы (например, порядковый номер или часть исходного имени, которая делает его уникальным).Для обеспечения бесперебойного обмена данными между iiko и 1С, помимо решения вышеописанных проблем, мы рекомендуем учитывать следующие моменты:
Заключение:
Решение проблемы обмена данными между iiko и 1С:Бухгалтерией требует внимательного подхода к кодировкам и формату имен колонок. В большинстве случаев изменение кодировки в iiko оказывается быстрым и эффективным решением. Если же проблема сохраняется из-за специальных символов в названиях колонок, мы будем вынуждены доработать внешнюю обработку 1С, чтобы обеспечить корректную загрузку данных. Эти шаги помогут нам наладить стабильный и безошибочный обмен данными, значительно упрощая ведение учета.