Как выгрузить данные из 1С в CSV-файл и настроить параметры запроса

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

Разработка собственной выгрузки данных из 1С в текстовый формат CSV — частая задача при интеграции системы с веб-сайтами или внешними сервисами. Разберем по шагам, как правильно составить запрос к регистру накопления, сформировать CSV-файл и избежать распространенных ошибок при разработке обработки на платформе 1С 8.2.

Установка условий в виртуальных таблицах и исправление ошибок в запросах

При получении остатков из регистров накопления часто возникает необходимость отсечь нулевые или отрицательные позиции. Проанализируем важную особенность виртуальных таблиц: в параметрах виртуальной таблицы остатков нельзя задавать условия на рассчитываемые ресурсы (например, КоличествоОстаток > 0).

Параметр «Условие» виртуальной таблицы предназначен только для отбора по измерениям и их реквизитам до выполнения вычислений. Если требуется отобрать только положительные остатки, условие следует выносить в секцию ГДЕ основного запроса:


ВЫБРАТЬ
	ТоварыОстатки.Организация КАК Организация,
	ТоварыОстатки.Товар КАК Номенклатура,
	ТоварыОстатки.НомерГТД КАК НомерГТД,
	ТоварыОстатки.КоличествоОстаток КАК Количество
ИЗ
	РегистрНакопления.ТоварыОрганизацийБУ.Остатки(&Период, Организация = &Организация) КАК ТоварыОстатки
ГДЕ
	ТоварыОстатки.КоличествоОстаток > 0

Частой ошибкой при передаче параметров в запрос является опечатка в наименовании параметра в коде 1С. Например, если в тексте запроса указано &Организация, а при установке параметра вызван метод Запрос.УстановитьПараметр("Огранизация", Организация), система выдаст ошибку о том, что параметр не задан. Внимательно проверяйте совпадение имен параметров.

Создание алгоритма выгрузки остатков в CSV

Рассмотрим основной алгоритм формирования CSV-файла. Процесс выгрузки состоит из трех ключевых этапов:

  1. Получение данных из базы с помощью объекта Запрос.
  2. Обход выборки или таблицы значений с последовательной склейкой полей через заданный символ-разделитель (например, ;, , или |).
  3. Запись полученной текстовой строки в файл на диске с помощью объекта ЗаписьТекста.

Посмотрим на практический пример реализации функции получения данных и их сохранения в CSV-файл:


Функция ПолучитьТаблицуОстатков(Организация)
	Запрос = Новый Запрос;
	Запрос.Текст =
		"ВЫБРАТЬ
		|	ТоварыОстатки.Организация КАК Организация,
		|	ТоварыОстатки.Товар КАК Номенклатура,
		|	ТоварыОстатки.НомерГТД КАК НомерГТД,
		|	ТоварыОстатки.КоличествоОстаток КАК Количество
		|ИЗ
		|	РегистрНакопления.ТоварыОрганизацийБУ.Остатки(, Организация = &Организация) КАК ТоварыОстатки
		|ГДЕ
		|	ТоварыОстатки.КоличествоОстаток > 0";
	
	Запрос.УстановитьПараметр("Организация", Организация);
	Возврат Запрос.Выполнить().Выгрузить();
КонецФункции

Процедура ВыгрузитьОстаткиВCSV(ПутьКФайлу, Организация)
	ТаблицаДанных = ПолучитьТаблицуОстатков(Организация);
	Разделитель = "|";
	
	// Открываем файл для записи в кодировке UTF-8
	ЗаписьФайла = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
	
	// Сформируем заголовок файла из имен колонок
	Заголовок = "";
	Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл
		Заголовок = Заголовок + Колонка.Имя + Разделитель;
	КонецЦикла;
	ЗаписьФайла.ЗаписатьСтроку(Заголовок);
	
	// Выгружаем строки данных
	Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл
		СтрЗапись = "";
		Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл
			СтрЗапись = СтрЗапись + Строка(СтрокаТЗ[Колонка.Имя]) + Разделитель;
		КонецЦикла;
		ЗаписьФайла.ЗаписатьСтроку(СтрЗапись);
	КонецЦикла;
	
	ЗаписьФайла.Закрыть();
КонецПроцедуры

Оптимизированный способ выгрузки через прямой обход выборки

Если объем выгружаемых данных велик, загрузка всех записей в объект ТаблицаЗначений может потребовать значительного объема оперативной памяти. В таких случаях эффективнее выполнять запись в файл непосредственно при обходе объекта ВыборкаИзРезультатаЗапроса:


Процедура ВыгрузитьОстаткиБыстро(ПутьКФайлу, Склад)
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ТоварыОстатки.Склад КАК Склад,
		|	ТоварыОстатки.Номенклатура КАК Номенклатура,
		|	ТоварыОстатки.КоличествоОстаток КАК КоличествоОстаток
		|ИЗ
		|	РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК ТоварыОстатки";
	
	Запрос.УстановитьПараметр("Склад", Склад);
	Запрос.УстановитьПараметр("Период", ТекущаяДата());
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	ТекстЗапись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
	Разделитель = ";";
	
	Пока Выборка.Следующий() Цикл
		СтрокаТекста = "" + Выборка.Склад + Разделитель
					+ Выборка.Номенклатура + Разделитель
					+ Выборка.КоличествоОстаток;
		ТекстЗапись.ЗаписатьСтроку(СтрокаТекста);
	КонецЦикла;
	
	ТекстЗапись.Закрыть();
КонецПроцедуры

Важные нюансы при работе с файлами и строками

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

← На главную