Шаблон кода для вывода данных в табличный документ Часто при разработке необходимо вывести данные в печатную форму, ниже шаблон вывода в табличный документ
Пример процедуры Вывода на печать
Код 1C v 8.х Процедура Печать(ТабДок) Экспорт
//создание нового табличного документа
ТабДок = Новый ТабличныйДокумент;
//получение макета для печати расходной накладной
Макет = Документы.РасходнаяНакладная.ПолучитьМакет("Основной");
//получим область "Заголовок" как новый табличный документ (!)
Область = Макет.ПолучитьОбласть("Заголовок");
//укажем параметры области
Область.Параметры.НомерДокумента = Номер;
Область.Параметры.От = Дата;
Область.Параметры.Кому = Контрагент;
//выведем заполненную область "Заголовок" в табличный документ
ТабДок.Вывести(Область);
//выведем область "Шапка" в табличный документ
ТабДок.Вывести(Макет.ПолучитьОбласть("Шапка"));
//получение области "Строка"
//обратите внимание, что это можно сделать до цикла по строкам
Область = Макет.ПолучитьОбласть("Строка");
// вывод строк документа в печатную форму
Для Каждого СтрСостава Из Состав Цикл
//заполнение параметров области из строки табличной части
Область.Параметры.Заполнить(СтрСостава);
// вывод сформированной области в табличный документ
ТабДок.Вывести(Область);
КонецЦикла;
// вывод области "Подвал"
Область = Макет.ПолучитьОбласть("Подвал");
Область.Параметры.ИтогоКоличество = Состав.Итог("Количество");
Область.Параметры.ИтогоСумма = Состав.Итог("Сумма");
ТабДок.Вывести(Область);
//установим параметры отображения табличного документа
ТабДок.ТолькоПросмотр = Истина;
ТабДок.ОтображатьЗаголовки = Истина;
ТабДок.ОтображатьСетку = Ложь;
//покажем табличный документ на экране
ТабДок.Показать();
КонецПроцедуры<br>
Пример функции формирующей печатную форму Счета по Ссылке на документ:
Код 1C v 8.х Функция СформироватьПечатнуюФорму(СсылкаНаДокумент, ОбъектыПечати)
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_СчетНаОплату";
МакетОбработки = ПолучитьМакет("Счет");
//заполняем шапку
ОбластьШапка = МакетОбработки.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.НомерДокумента = СсылкаНаДокумент.Номер;
ОбластьШапка.Параметры.ДатаДокумента = СсылкаНаДокумент.Дата;
ОбластьШапка.Параметры.НазваниеОрганизации = СсылкаНаДокумент.Организация.Наименование;
//выводим шапку в табличный документ
ТабличныйДокумент.Вывести(ОбластьШапка);
//заполняем строки ТЧ
ОбластьСтроки = МакетОбработки.ПолучитьОбласть("СтрокаТЧ");
// Перебор строк документа
Для Каждого ТекущаяСтрока Из СсылкаНаДокумент.Товары Цикл
ЗаполнитьЗначенияСвойств(ОбластьСтроки.Параметры, ТекущаяСтрока);
ТабличныйДокумент.Вывести(ОбластьСтроки);
КонецЦикла;
//заполняем подвал
ОбластьПодвал = МакетОбработки.ПолучитьОбласть("Подвал");
ОбластьПодвал.Параметры.КоличествоИтог = СсылкаНаДокумент.Товары.Итог("Количество");
ОбластьПодвал.Параметры.СуммаИтог = СсылкаНаДокумент.Товары.Итог("Сумма");
ОбластьПодвал.Параметры.ИмяОтветственного = СсылкаНаДокумент.Менеджер.Наименование;
//выводим подвал в табличный документ
ТабличныйДокумент.Вывести(ОбластьПодвал);
// Установим настройки выводимого документа
ТабличныйДокумент.АвтоМасштаб = Истина;
Возврат ТабличныйДокумент;
КонецФункции
Категория:
Табличный документ Оформление строки в ПриПолученииДанных или ПриВыводеСтроки Событие ПриПолученииДанных использется для оформления ячеек строк данных, отображаемых табличным полем. Обработчик данного события вызывается табличным полем в тех же случаях, что и обработчик ПриВыводеСтроки , т.е. при обновлении данных, отображаемых табличным полем или при поиске по подстроке. Важно отметить, что обработчик данного события вызывается табличным полем перед вызовом обработчиков события ПриВыводеСтроки для всех видимых строк табличного поля. Основным отличием данного события от события ПриВыводеСтроки является то, что в обработчике события ПриПолученииДанных можно изменять настройки ячеек группы строк, а не одной строки как в обработчике события ПриВыводеСтроки .
Обрабатывая данное событие можно изменять шрифт, цвет фона или текста, как определенной ячейки, так и всей строки табличного поля, устанавливать высоту или видимость ячеек строки табличного поля, а также устанавливать картинку, флажок или новый текст в ячейке. Параметром данного события является объект типа ОформлениеСтрок - коллекция объектов типа ОформлениеСтроки , являющихся оформлениями строк табличного поля.
Пример кода:
Код 1C v 8.х Процедура ТППриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
Попытка
ОформлениеСтроки.Ячейки.ПредоплатаОтсрочка.УстановитьТекст(?(ОформлениеСтроки.ДанныеСтроки.Ссылка.Счет.ДоговорКонтрагента.КонтролироватьЧислоДнейЗадолженности, "ОТСРОЧКА","ПРЕДОПЛАТА"));
Исключение
КонецПопытки;
Если ОформлениеСтроки.Ячейки.Доставка.Значение = Неопределено Тогда
возврат;
КонецЕсли;
Если ДанныеСтроки.Доставка.Проведен Тогда
ОформлениеСтроки.Ячейки.Картинка.ИндексКартинки = 0;
ИначеЕсли ДанныеСтроки.Доставка.ПометкаУдаления Тогда
ОформлениеСтроки.Ячейки.Картинка.ИндексКартинки = 1;
Иначе
ОформлениеСтроки.Ячейки.Картинка.ИндексКартинки = 2;
КонецЕсли;
ОформлениеСтроки.Ячейки.Картинка.ОтображатьКартинку = истина;
Если ДанныеСтроки.СтатусНов = "Нет машины" Тогда
ОформлениеСтроки.Ячейки.СтатусНов.ЦветФона = Новый Цвет(255, 196, 196);
ИначеЕсли ДанныеСтроки.СтатусНов = "Нет разрешения" Тогда
текцвет = Новый Цвет(255, 196, 196);
Если ДанныеСтроки.Доставка.ДатаДоставки = НачалоДня(РабочаяДата) Тогда
ТекВремя = Дата(1,1,1)+(ТекущаяДата()-НачалоДня(ТекущаяДата()));
Попытка ПодачаМашины=?(ДанныеСтроки.Доставка.ВремяЗагрузкиФакт[0].ПодачаМашины>ДанныеСтроки.Доставка.ВремяПриездаЭкспедитораФакт,ДанныеСтроки.Доставка.ВремяЗагрузкиФакт[0].ПодачаМашины,ДанныеСтроки.Доставка.ВремяПриездаЭкспедитораФакт); Исключение ПодачаМашины = ДанныеСтроки.Доставка.ВремяПриездаЭкспедитораФакт; КонецПопытки;
Если ПодачаМашины+(15*60)> ТекВремя Тогда ОформлениеСтроки.Ячейки.СтатусНов.УстановитьТекст("Получение разрешения"); текцвет = Новый Цвет(255, 225, 225); КонецЕсли;
КонецЕсли;
ОформлениеСтроки.Ячейки.СтатусНов.ЦветФона = текцвет;
ИначеЕсли ДанныеСтроки.СтатусНов = "Загрузка" Тогда
ОформлениеСтроки.Ячейки.СтатусНов.ЦветФона = Новый Цвет(255, 153, 0);
ИначеЕсли ДанныеСтроки.СтатусНов = "В пути" Тогда
ОформлениеСтроки.Ячейки.СтатусНов.ЦветФона = Новый Цвет(255, 255, 0);
ИначеЕсли ДанныеСтроки.СтатусНов = "На объекте" Тогда
ОформлениеСтроки.Ячейки.СтатусНов.ЦветФона = Новый Цвет(51, 204, 204);
ИначеЕсли ДанныеСтроки.СтатусНов = "Завершено" Тогда
ОформлениеСтроки.Ячейки.СтатусНов.ЦветФона = Новый Цвет(137, 255, 113);
КонецЕсли;
Если ЗначениеЗаполнено(ДанныеСтроки.СтатусSMS) Тогда
Если ДанныеСтроки.СтатусSMS = "Доставлено" Тогда
ОформлениеСтроки.Ячейки.СтатусSMS.ЦветФона = Новый Цвет(137, 255, 113);
ИначеЕсли ДанныеСтроки.СтатусSMS = "Поставлено в очередь" ИЛИ
ДанныеСтроки.СтатусSMS = "Отправляется" ИЛИ
ДанныеСтроки.СтатусSMS = "Отправлено" Тогда
ОформлениеСтроки.Ячейки.СтатусSMS.ЦветФона = Новый Цвет(255, 255, 0);
Иначе
ОформлениеСтроки.Ячейки.СтатусSMS.ЦветФона = Новый Цвет(255, 0, 0);
КонецЕсли;
КонецЕсли;
ОформлениеСтроки.Ячейки.колКОтгрузке.УстановитьТекст(ДанныеСтроки.колКОтгрузке);
Если ДанныеСтроки.колКОтгрузке = "ОК" Тогда
ОформлениеСтроки.Ячейки.колКОтгрузке.ЦветФона = Новый Цвет(200, 255, 200);
Иначе
ОформлениеСтроки.Ячейки.колКОтгрузке.ЦветФона = Новый Цвет(255, 0, 0);
КонецЕсли;
ОформлениеСтроки.Ячейки.колСДоставки.УстановитьТекст(ДанныеСтроки.колСДоставки);
Если ДанныеСтроки.колСДоставки = "ОК" Тогда
ОформлениеСтроки.Ячейки.колСДоставки.ЦветФона = Новый Цвет(200, 255, 200);
Иначе
ОформлениеСтроки.Ячейки.колСДоставки.ЦветФона = Новый Цвет(255, 0,0);
КонецЕсли;
//Доставка до 14.00 раскраска цветом
Если НЕ (ДанныеСтроки.Доставка.ВидДоставки = Перечисления.ВидыДоставки.Самовывоз или ДанныеСтроки.Доставка.ВидДоставки = Перечисления.ВидыДоставки.Централизация) Тогда
Если ДанныеСтроки.Доставка.Дата < НачалоДня(ДанныеСтроки.Доставка.Дата)+60*60*14 Тогда ОформлениеСтроки.Ячейки.Менеджер.ЦветФона = Новый Цвет(166, 255, 166); Иначе ОформлениеСтроки.Ячейки.Менеджер.ЦветФона = Новый Цвет(255, 166,166); КонецЕсли;
КонецЕсли;
КонецПроцедуры
А вот так это выглядит в реальности:
Категория:
Список Справочника, Документов, Регистров Срез последних (остатки) на каждую дату Бывают ситуации, когда в запросе требуется получить остатки не на фиксированную дату (параметр - один на весь отчет), а на произвольную, (когда дата остатков в каждой строке своя).
Существует несколько способов получить нужные данные.
1.Непосредственно в запросе (через реальную таблицу регистра)
Способ подходит практически для любой ситуации, и поэтому наиболее универсален. Единственный, пожалуй, минус этого способа - если в отчете пользователю не требуется курс, то запрос быдет выбирать избыточные данные.
Вызов СрезПоследних() можно использовать только с передачей в него заранее готового значения даты, на которую требуется получить значения. Поэтому сабж делается через стыковку нескольких запросов - основной, к нему стыкуется запрос по регистру сведений с условием по дате и поиском записи с максимальной датой (периодом).
Код 1C v 8.х ВЫБРАТЬ
Таб1.СсылкаДок,
Таб1.ДатаДок,
Таб1.ВалютаДок,
Таб2.Курс
ИЗ
(ВЫБРАТЬ
ЗаказПокупателя.Ссылка КАК СсылкаДок,
ЗаказПокупателя.Дата КАК ДатаДок,
ЗаказПокупателя.ВалютаДокумента КАК ВалютаДок,
МАКСИМУМ(Валюты.Период) КАК ПериодДок
ИЗ
Документ.ЗаказПокупателя КАК ЗаказПокупателя
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК Валюты
ПО Валюты.Период <= ЗаказПокупателя.Дата И
Валюты.Валюта = ЗаказПокупателя.ВалютаДокумента
СГРУППИРОВАТЬ ПО
ЗаказПокупателя.Ссылка) КАК Таб1
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК Таб2
ПО Таб1.ПериодДок = Таб2.Период И Таб1.ВалютаДок = Таб2.Валюта
Для общего развития:
Что есть срез последних в платформе?
Код 1C v 8.х ВЫБРАТЬ
Рег.Период,
Рег.Измерение,
Рег.Ресурс
ИЗ
РегситрСведений.ПериодическийРегистр.СрезПоследних(&Дата) КАК Рег
В зависимости от периодичности регистра (по времени, по позизии регистратора) ВТ разворачивается в следующий запрос:
1. По времени (год, месяц, ... секунда)
Код 1C v 8.х ВЫБРАТЬ
Таблица3.Ресурс,
Таблица3.Измерение,
Таблица3.Период
ИЗ
(ВЫБРАТЬ
Таблица1.Измерение КАК Измерение,
МАКСИМУМ(Таблица1.Период) КАК Период
ИЗ
РегистрСведений.ПериодическийРегистр КАК Таблица1
ГДЕ
Таблица1.Период <= &Дата
СГРУППИРОВАТЬ ПО
Таблица1.Измерение) КАК Таблица2
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПериодическийРегистр КАК Таблица3
ПО Таблица2.Измерение= Таблица3.Измерение
И Таблица2.Период = Таблица3.Период
2. По позиции регистратора
В данном случае нужно еще раз обернуть выборку
Код 1C v 8.х ВЫБРАТЬ
Таблица5.Ресурс,
Таблица5.Измерение,
Таблица5.Период,
Таблица5.Регистратор
ИЗ
(ВЫБРАТЬ
МАКСИМУМ(Таблица3.Регистратор) КАК Регистратор,
Таблица3.Измерение
ИЗ
(ВЫБРАТЬ
Таблица1.Измерение КАК Измерение,
МАКСИМУМ(Таблица1.Период) КАК Период
ИЗ
РегистрСведений.ПериодическийРегистр КАК Таблица1
ГДЕ
Таблица1.Период <= &Дата
СГРУППИРОВАТЬ ПО
Таблица1.Измерение) КАК Таблица2
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПериодическийРегистр КАК Таблица3
ПО Таблица2.Измерение= Таблица3.Измерение
И Таблица2.Период = Таблица3.Период
СГРУППИРОВАТЬ ПО
Таблица3.Измерение) КАК Таблица4
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПериодическийРегистр КАК Таблица5
ПО Таблица4.Измерение = Таблица5.Измерение
И Таблица4.Регистратор = Таблица5.Регистратор
Все это можно увидеть посмотрев технологический журнал с включенным режимом протоколирования запросов
2.Система компоновки данных (передача набора значений одной таблицы в параметр виртуальной таблицы)
Данный способ подходит для отчетов. Из очевидных плюсов - если курс (или другие данные) не нужны для построения отчета, то СКД не будет их получать. Однако быстродействие такого отчета может оказаться и несколько ниже, чем в первом способе.
Для примера сделаем отчет - список заказов покупателей.
Для этого создадим набор данных "Документы" - запрос:
Код 1C v 8.х ВЫБРАТЬ
ЗаказПокупателя.Ссылка КАК ЗаказПокупателя,
ЗаказПокупателя.Дата КАК Дата,
ЗаказПокупателя.ВалютаДокумента КАК ВалютаДокумента,
ЗаказПокупателя.СуммаДокумента КАК СуммаДокумента
{ВЫБРАТЬ
ЗаказПокупателя.*,
Дата,
ВалютаДокумента.*,
СуммаДокумента}
ИЗ
Документ.ЗаказПокупателя КАК ЗаказПокупателя
{ГДЕ
ЗаказПокупателя.Ссылка.* КАК ЗаказПокупателя,
ЗаказПокупателя.СуммаДокумента}
Для того, чтобы потом успешно свзать наборы данных, в запрос необходимо включить поля "Дата" и "ВалютаДокумента". Чтобы они не появлялись в списке доступных полей, если это необходимо, их можно убрать, установив флажки ограничений в таблице "Поля" схемы компоновки. В остальном запрос вряд ли требует комментариев.
Для того, чтобы получить информацию о курсах валют, добавим второй набор данных-запрос, "Курсы валют":
Код 1C v 8.х ВЫБРАТЬ
&Дата КАК Дата,
КурсыВалютСрезПоследних.Валюта КАК Валюта,
КурсыВалютСрезПоследних.Курс КАК Курс,
КурсыВалютСрезПоследних.Кратность КАК Кратность
{ВЫБРАТЬ
Дата,
Валюта.*,
Курс,
Кратность}
ИЗ
РегистрСведений.КурсыВалют.СрезПоследних(&Дата, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
{ГДЕ
КурсыВалютСрезПоследних.Курс,
КурсыВалютСрезПоследних.Кратность}
В этом запросе имеются 2 параметра: "Дата" и "Валюта". Эти параметры будут установлены СКД при соединении наборов. Кроме того, параметр "Дата" указан в выбранных полях - это нужно для соединения таблиц.
Для ненужный полей "Дата" и "Валюта" также устанавливаем флажки ограничений, чтобы они не появлялись в доступных полях.
Перейдем к соединению наборов. На странице "Связи наборов данных" добавим 2 связи:
1. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "Дата", выражение приемник - "Дата", Параметр - "Дата"
2. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "ВалютаДокумента", выражение приемник - "Валюта", Параметр - "Валюта"
Главное здесь - параметры связи. При соединении наборов данных, если указан параметр, СКД передает в подчиненный набор (в нашем случае - запрос "Курсы валют") параметры, указанные в соединении. Значениями параметров будут значения соответствующих полей набора-источника.
Перейдем к вычисляемым полям. Добавим вычисляемое поле "СуммаВВалютеУпрУчета". Выражение поля - "СуммаДокумента * Курс / Кратность".
Также укажем поля "СуммаДокумента" и "СуммаВВалютеУпрУчета" как ресурсы
Настроим отчет.
Добавим одну группировку "Детальные записи", в выбранных полях укажем "ЗаказПолкупателя", "Курс" и "Кратность". Добавим ресурсы "СуммаДокумента" и "СуммаВВалютеУпрУчета"
Можно формировать отчет
Категория:
Регистры накопления Внешняя печатная форма, дополнительные параметры для печати Внешняя обработка (Печатная форма), содержащая: Необязательный реквизит «
ДополнительныеПараметры »
произвольного типа , которому будут передаваться дополнительные параметры примитивного типа в виде структуры.
Аналогично можно передать параметр во внешнюю печатную форму через реквизит «ДополнительныеПараметры».
В модуле обработки для использования этих параметров используем следующий код вида:
Код 1C v 8.х Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда
Если ДополнительныеПараметры.Свойство("КодФилиала") Тогда
КодФилиала = ДополнительныеПараметры.КодФилиала;
Иначе
КодФилиала="";
КонецЕсли;
Если ДополнительныеПараметры.Свойство("КодОрганизации") Тогда
КодОрганизации = ДополнительныеПараметры.КодОрганизации;
Иначе
КодОрганизации="";
КонецЕсли;
Если ДополнительныеПараметры.Свойство("ОтделениеБанка") Тогда
ОтделениеБанка = ДополнительныеПараметры.ОтделениеБанка;
Иначе
ОтделениеБанка="";
КонецЕсли;
Если ДополнительныеПараметры.Свойство("НомерДоговора") Тогда
НомерДоговора = ДополнительныеПараметры.НомерДоговора;
Иначе
НомерДоговора="";
КонецЕсли;
Если ДополнительныеПараметры.Свойство("ДатаДоговора") Тогда
ДатаДоговора = ДополнительныеПараметры.ДатаДоговора;
Иначе
ДатаДоговора="";
КонецЕсли;
КонецЕсли;
Настроим передачу параметров внешней печатной форме
Для этого создаем новый элемент справочника «Внешние обработки» и заполняем его, как показано на рисунке ниже
В табличной части открываем Параметры обработки и вводим значения параметров
Категория:
Внешние печатные формы, отчеты и обработк… Вывести табличный документ в PDF Данный пример работает на платформе выше 8.2.13
Код 1C v 8.х Макет = ПолучитьМакет("Макет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок = Новый ТабличныйДокумент;
ОбластьШапка.Параметры.НомерДок = Номер;
ОбластьШапка.Параметры.ДатаДок = Формат(Дата, "DDMMMMYYYY");
ОбластьШапка.Параметры.Руководитель = Руководитель;
ТабДок.Вывести(ОбластьШапка);
ТабДок.Защита=Истина;
ВремФайл=ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ВремФайл,ТипФайлаТабличногоДокумента.PDF);
ЗапуститьПриложение(ВремФайл);
Категория:
Табличный документ Как получить Временный каталог или Временный файл Временный каталог:
Код 1C v 8.х КаталогВременныхФайлов()
Получает имя каталога, который используется программой для размещения временных файлов.
Пример:
Код 1C v 8.х ГдеИскать = КаталогВременныхФайлов();
Код 1C v 8.2 УП // В тонком клиенте код работает
ИмяФайла = КаталогВременныхФайлов() + Элемент.ТекущиеДанные.ПредставлениеВложения;
Данные.Записать(ИмяФайла);
ЗапуститьПриложение(ИмяФайла);
!!! КаталогВременныхФайлов() недоступен на Веб-клиенте !!!
Это ограничение web-клиента. Вся работа с файловой системой в интерактивном режиме. Типа безопасность клиентской машины прежде всего
Временный файл:
Код 1C v 8.х ПолучитьИмяВременногоФайла(<Расширение> (необязательный)
Указывает желаемое расширение имени временного файла. Если параметр не задан, то создается временный файл с расширением по умолчанию (.tmp). Желаемое расширение задается строкой, которая и будет использована в качестве расширения. Указание точки в начале расширения не обязательно. Например, при указании ".xml" или "xml" результат будет одинаковый.
!!! Рекомендуется удалять временный файл самостоятельно после его использования. !!!
Пример:
Код 1C v 8.х Для каждого СтрокаТаблицы Из ТаблицаОтчетов Цикл
ИмяТемпФайла = ПолучитьИмяВременногоФайла();
СтрокаТаблицы.Отчет.Записать(ИмяТемпФайла,
ТипФайлаТабличногоДокумента.HTML);
ТекстHТМЛ = Новый ТекстовыйДокумент;
ТекстHТМЛ.Прочитать(ИмяТемпФайла);
ТекстHТМЛ = ТекстHТМЛ.ПолучитьТекст();
// ...
КонецЦикла;
Код 1C v 8.х Макет = ПолучитьМакет("Макет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок = Новый ТабличныйДокумент;
ОбластьШапка.Параметры.НомерДок = Номер;
ОбластьШапка.Параметры.ДатаДок = Формат(Дата, "DDMMMMYYYY");
ОбластьШапка.Параметры.Руководитель = Руководитель;
ТабДок.Вывести(ОбластьШапка);
ТабДок.Защита=Истина;
ВремФайл=ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ВремФайл,ТипФайлаТабличногоДокумента.PDF);
ЗапуститьПриложение(ВремФайл);
Категория:
Работа с Файлами и Каталогами Загрузка данных из текстовых файлов, выбирая SQL запросом данные из этих файлов Часто бывает потребность загружать данные из текстовых форматов, причем информация для загрузки бьется на 2 и более файлов.
Хорошо бы посредством SQL запроса выбирать данные из этих файлов и производить загрузку! Это вполне возможно и я считаю этот способ наиболее грамотный для решения таких задач!
Рассмотрим вариант как это сделать! Имеем 2 файла:
- Head_XXXXX.txt
- Rows_XXXXX.txt
Где XXXXX – порядковой номер пары файлов
Структура строки в Head_XXXXX.txt
Код Колонка1 20 символов – Номер заказа
Колонка2 5 символов – Код контрагента
Колонка3 10 символов – Дата заказа
Колонка4 10 символов – Дата доставки
Колонка5 10 символов – Дата сбора
Колонка6 4 символов – Количество строк в ТЧ
Структура строки в Rows_XXXXX.txt
Код Колонка1 20 символов – Номер заказа
Колонка2 7 символов – Артикул номенклатуры
Колонка3 9 символов – Количество в базовых ед. изм.
В каждой паре файлов несколько Заказов. Необходимо загрузить эти заказы в БД 1С
Для этого воспользуемся Microsoft.Jet.OLEDB.4.0
Для того чтоб данный драйвер корректно понимал структуру файлов необходимо в каталоге расположения данных файлов, перед выполнением запросов, создать специальный текстовый файл
schema.ini cо следующими строками:
Код [ Head_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=StoreNum Text Width 5
Col3=DataNote DateTime Width 10
Col4=DataDev DateTime Width 10
Col5=DataDes DateTime Width 10
Col6=CountLine Long Width 4
[Rows_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=Articul Text Width 7
Col3=Counts Double Width 9
Как видим, здесь мы задаем структуру таблицы из файла.
Остается только выполнить запрос к полученной текстовой БД и обработать результат:
Ниже приведен пример кода для платформы 1С 8:
Код 1C v 8.х // Загружает данные из текстовых данных
//
// Параметры
// Стр_КаталогДанных - <Строка>
//
// Автор: Gmix 04.05.2006 12:22:09
//
// Возвращаемое значение:
// <Булево>
//
Функция ЗагрузитьДанныеИзtxt(Стр_КаталогДанных)
// проверки заполнения
ОБ_ФайлДанных=Новый Файл(Стр_КаталогДанных);
Если НЕ ОБ_ФайлДанных.ЭтоКаталог() Тогда
Сообщить("Необходимо указать каталог данных!",СтатусСообщения.ОченьВажное);
Возврат Ложь;
КонецЕсли;
Если НЕ ОБ_ФайлДанных.Существует() Тогда
Сообщить("Каталог """+Стр_КаталогДанных+""" не существует!",СтатусСообщения.ОченьВажное);
Возврат Ложь;
КонецЕсли;
ОБ_АДОКонект = Новый COMОбъект("ADODB.Connection");
ОБ_АДОРекордсетШапка = Новый COMОбъект("ADODB.Recordset");
ОБ_АДОРекордсетСтроки = Новый COMОбъект("ADODB.Recordset");
//Определяем пару файлов
Стр_ОкончаниеФайла="";
ФайлыШапок = НайтиФайлы(Стр_КаталогДанных, "Head_*.txt");
Для каждого ФайлШапки Из ФайлыШапок Цикл
Стр_ОкончаниеФайла=Сред(ФайлШапки.ИмяБезРасширения,6);
Стр_таблицаШапки=ФайлШапки.Имя;
Стр_ТаблицаСтрок="Rows_"+Стр_ОкончаниеФайла+".txt";
Стр_ИмяФайлСтрок=ДобавлениеСлеша(Стр_КаталогДанных)+Стр_ТаблицаСтрок;
ФайлСтрок=Новый Файл(Стр_ИмяФайлСтрок);
Если НЕ ФайлСтрок.Существует() Тогда
Сообщить("Не найден файл строк для файла шапки """+Стр_таблицаШапки+"""! Пара файлов не обработана",СтатусСообщения.Важное);
Продолжить;
КонецЕсли;
//Создаем схему данных
ФайлСхемыДанных=Новый Файл(ДобавлениеСлеша(Стр_КаталогДанных)+"schema.ini");
Если ФайлСхемыДанных.Существует() Тогда
Попытка
УдалитьФайлы(ФайлСхемыДанных.Путь,ФайлСхемыДанных.Имя);
Исключение
Сообщить("Не возможно удалить файл """+ФайлСхемыДанных.ПолноеИмя+""" для создания новой схемы данных! Проверте атрибуты файла",СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
КонецЕсли;
Стр_СхемаДанныхТхт="["+Стр_таблицаШапки+"]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=StoreNum Text Width 5
|Col3=DataNote DateTime Width 10
|Col4=DataDev DateTime Width 10
|Col5=DataDes DateTime Width 10
|Col6=CountLine Long Width 4
|["+Стр_ТаблицаСтрок+"]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=Articul Text Width 7
|Col3=Counts Double Width 9";
ТекстСхемы=Новый ЗаписьТекста(ФайлСхемыДанных.ПолноеИмя, КодировкаТекста.ANSI);
ТекстСхемы.Записать(Стр_СхемаДанныхТхт);
ТекстСхемы.Закрыть();
// Создаем коннект
Попытка
ОБ_АДОКонект.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Стр_КаталогДанных+";Extended Properties='text;FMT=Delimited;HDR=NO'");
Исключение
Сообщить("Невозможно открыть соединение!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Стр_SQL = "S_elect * FROM "+Стр_таблицаШапки;
Попытка
ОБ_АДОРекордсетШапка=ОБ_АДОКонект.Execute(Стр_SQL);
Исключение
Сообщить("Ошибка выполнения запроса """+Стр_SQL+"""!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Пока НЕ ОБ_АДОРекордсетШапка.EOF Цикл
// Заказ
Стр_НомерЗаказа = ОБ_АДОРекордсетШапка.Fields("NumberNote").Value;
Стр_КодКА= ОБ_АДОРекордсетШапка.Fields("StoreNum").Value;
Д_ДатаЗаказа= ОБ_АДОРекордсетШапка.Fields("DataNote").Value;
Д_ДатаДоставки= ОБ_АДОРекордсетШапка.Fields("DataDev").Value;
Д_ДатаСбора= ОБ_АДОРекордсетШапка.Fields("DataDes").Value;
Ч_КоличествоСтрок = ОБ_АДОРекордсетШапка.Fields("CountLine").Value;
Сообщить("Заказ № "+Стр_НомерЗаказа+" от " +Д_ДатаЗаказа+ " Код контрагента: "+Стр_КодКА+" Дата доставки: "+Д_ДатаДоставки);
// Обработка строк заказа
Стр_SQL = "S_elect * FROM "+Стр_ТаблицаСтрок+" WHERE NumberNote='"+Стр_НомерЗаказа+"'";
Попытка
ОБ_АДОРекордсетСтроки=ОБ_АДОКонект.Execute(Стр_SQL);
Исключение
Сообщить("Ошибка выполнения запроса """+Стр_SQL+"""!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Сч=0;
Сообщить(" № Артикул Количество");
Пока НЕ ОБ_АДОРекордсетСтроки.EOF Цикл
//Заполняем таб часть документа
Сч=Сч+1;
Стр_Артикул=СокрЛП(ОБ_АДОРекордсетСтроки.Fields("Articul").Value);
Ч_Количество=ОБ_АДОРекордсетСтроки.Fields("Counts").Value;
Сообщить(""+Сч+" " +Стр_Артикул+ " "+Ч_Количество);
ОБ_АДОРекордсетСтроки.MoveNext();
КонецЦикла;
ОБ_АДОРекордсетШапка.MoveNext();
КонецЦикла;
КонецЦикла;
Возврат Истина;
КонецФункции // ЗагрузитьДанныеИзtxt() Gmix 04.05.2006 12:22:21
Автор:
Журавлев Михаил Викторович Категория:
Конвертация данных, Обмен, Перенос Диаграмма Ганта - Как выделить выходные другим цветом? Код 1C v 8.х Неделя = 3600 * 24 * 7;
Выходные = 3600 * 48;
МаксимальнаяДата =ДатаД1; // + Неделя * 4;
ТекущаяДата = ДатаД;
Пока ТекущаяДата <= МаксимальнаяДата Цикл
Конец = НачалоНедели(ТекущаяДата);
Начало = Конец - Выходные;
ИнтФ=ДГ.ИнтервалыФона.Добавить(Начало, Конец);
ИнтФ.Цвет = WebЦвета.Красный;
ТекущаяДата = ТекущаяДата + Неделя;
КонецЦикла;
Категория:
Диаграмма Удаление документа Код 1C v 8.2 УП &НаКлиенте
Процедура УдалитьДокумент(Команда)
// Вставить содержимое обработчика.
УдалитьДокументНаСервере(0);
КонецПроцедуры
&НаСервере
Процедура УдалитьДокументНаСервере(ПометкаУдаления)
// Вставить содержимое обработчика.
Перем УдаляемыйДокумент;
УдаляемыйДокумент =Документы.РасходнаяНакладная.НайтиПоНомеру("000000004");
Если ПометкаУдаления = 1 Тогда
УдаляемыйДокумент.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
Иначе
УдаляемыйДокумент.ПолучитьОбъект().Удалить();
КонецЕсли;
КонецПроцедуры
Код 1C v 8.х //Установить пометку удаления документа
ТС=ЭлементыФормы.Список.ТекущиеДанные;
ТД=Документы.РеализацияТоваровУслуг.НайтиПоНомеру(ТС.Номер, ТС.Дата);
Если ТД.Пустая() Тогда
Сообщить("Документ по номеру <такому то> не найден");
возврат;
КонецЕсли;
ТД.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
Код 1C v 8.х // Непосредственное удаление документов
Запрос = Новый Запрос("ВЫБРАТЬ
| Заказы.Ссылка
|ИЗ
| Документ.Заказы КАК Заказы
|ГДЕ
| Заказы.ПометкаУдаления = ИСТИНА");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОбъектДокумент = Выборка.Ссылка.ПолучитьОбъект();
ОбъектДокумент.Удалить();
КонецЦикла;
Код 1C v 7.x Д = СоздатьОбъект("Документ");
Д.ВыбратьДокументы(НачДата,КонДата);
Пока Д.ПолучитьДокумент() = 1 Цикл
Сообщить(Д.ТекущийДокумент());
Состояние(Д.ДатаДок);
Д.Удалить();
КонецЦикла;
Категория:
Документы Прямой SQL запрос к базе 7.7 из базы 8.x Код 1C v 8.х РабДата=Лев(СокрЛП(РабочаяДата),10);
//НачПрошлогоМесяца=Лев(СокрЛП(НачалоМесяца(ДобавитьМесяц(РабочаяДата, -1 ))),10);
НачПрошлогоМесяца=Лев(СокрЛП(НачалоМесяца(РабочаяДата)),10);
НачМесяца=Лев(СокрЛП(НачалоМесяца(РабочаяДата)),10);
МойЗапрос = "
|S_elect SC172.DESCR, RG38027.SP38025, _1SJOURN.DOCNO, LEFT(_1SJOURN.DATE_TIME_IDDOC, 8) AS DATADOC, SUM(RG38027.SP38026) AS Ost
|FROM RG38027, SC172, _1SJOURN, DH38011
|WHERE (RG38027.SP38024 = SC172.ID) AND (CONVERT (DATETIME , RG38027.PERIOD) = CONVERT (DATETIME , '"+НачПрошлогоМесяца+"')) AND
|(RG38027.SP38025 = _1SJOURN.IDDOC) AND (RG38027.SP38025 = DH38011.IDDOC)
|AND (DH38011.SP38005 = ' 3Z ')
|GROUP BY SC172.DESCR, RG38027.SP38025, _1SJOURN.DOCNO, _1SJOURN.DATE_TIME_IDDOC
|
|U_nion ALL
|
|S_elect SC172.DESCR, RA38027.SP38025, _1SJOURN.DOCNO, LEFT(_1SJOURN.DATE_TIME_IDDOC, 8) AS DATADOC, SUM(RA38027.SP38026*(1-2*RA38027.DEBKRED)) AS Ost
|FROM RA38027, SC172, _1SJOURN, DH38011
|WHERE (RA38027.SP38024 = SC172.ID) AND (RA38027.IDDOC=_1SJOURN.IDDOC) AND
|(CONVERT (DATETIME , LEFT(_1SJOURN.DATE_TIME_IDDOC,8)) <= CONVERT (DATETIME , '"+РабДата+"')) AND
|(CONVERT (DATETIME , LEFT(_1SJOURN.DATE_TIME_IDDOC,8)) > CONVERT (DATETIME , '"+НачМесяца+"')) AND
|(RA38027.SP38025 = _1SJOURN.IDDOC) AND (RA38027.SP38025 = DH38011.IDDOC)
|AND (DH38011.SP38005 = ' 3Z ')
|GROUP BY SC172.DESCR, RA38027.SP38025, _1SJOURN.DOCNO, _1SJOURN.DATE_TIME_IDDOC
|HAVING SUM(RA38027.SP38026*(1-2*RA38027.DEBKRED)) > 0
|ORDER BY SC172.DESCR";
Connection = Новый COMОбъект("ADODB.Connection");
//Connection.Provider = Провайдер;
Connection.ConnectionString = мдСтрокаПодключения;
//Сообщить(МойЗапрос);
Попытка
Connection.Open();
Исключение
Сообщить("Подключение - bad!");
КонецПопытки;
RS = Новый COMОбъект("ADODB.Recordset");
//RS.CursorType = 3;
RS.Open(МойЗапрос, Connection );
ТЗ=Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("КонтрагентНаименование", ПолучитьОписаниеТиповС(50),"Контрагент",30);
ТЗ.Колонки.Добавить("ИДДокумента", ПолучитьОписаниеТиповС(10));
ТЗ.Колонки.Добавить("НомерДок", ПолучитьОписаниеТиповС(10),"№ заявки",10);
ТЗ.Колонки.Добавить("ДатаДок", ПолучитьОписаниеТиповС(10),"дата заявки",10);
ТЗ.Колонки.Добавить("СуммаОстаток", ПолучитьОписаниеТиповЧ(10, 2),"Сумма",15);
Пока RS.EOF() = 0 Цикл
КонтрагентНаименование = RS.Fields("DESCR").Value;
ИДДокумента = RS.Fields("SP38025").Value;
НомерДок = RS.Fields("DOCNO").Value;
ДатаДок = RS.Fields("DATADOC").Value;
СуммаОстаток = Число(RS.Fields("Ost").Value);
Если СуммаОстаток = 0 Тогда
RS.MoveNext();
Продолжить;
КонецЕсли;
Стр=ТЗ.Добавить();
Стр.КонтрагентНаименование = КонтрагентНаименование;
Стр.ИДДокумента = ИДДокумента;
Стр.НомерДок = НомерДок;
Стр.ДатаДок = Дата(ДатаДок);
Стр.СуммаОстаток = СуммаОстаток;
RS.MoveNext();
КонецЦикла;
Категория:
COM-объекты, WMI, WSH Документ "Операция" - Как программно создать и заполнить? В бухгалтерских подсистемах типовых конфигураций есть всем известный документ «Операция». Бухгалтерам не приходится долго объяснять, как им пользоваться. Все по-бухгалтерски просто и лаконично: счет дебета, счет кредита, субконто, количество, сумма и прочие атрибуты бухгалтерских проводок. Проводки вводятся вручную, поэтому результат абсолютно прозрачен и понятен.
Время от времени возникает необходимость массово ввести большое количество проводок. Ситуации могут быть самыми разными: загрузка остатков или наоборот - списание с учета, исправление ошибок в учете и т. д. И тут уже дело за программистом.
На первый взгляд задача может показаться простой: создать документ, заполнить таблицу проводок данными и провести. Но не тут-то было! Как только дело доходит до «Конфигуратора», начинаются сюрпризы. Оказывается, у документа «Операция» вообще нет таблицы проводок, которую мы видим в пользовательском режиме.
Как же так? А вот так! Документ «Операция" используется в качестве регистратора, а проводки пишутся непосредственно в регистр бухгалтерии.
Решается задача довольно просто. Рассмотрим в качестве примера фрагмент кода обработки загрузки остатков по счету 001 «Арендованные основные средства» из dbf-таблицы.
Код 1C v 8.х
ДокОперация = Документы.ОперацияБух.СоздатьДокумент();
ДокОперация.Дата = ДатаДокумента;
ДокОперация.Организация = Организация;
ДокОперация.Ответственный = Ответственный;
ДокОперация.Содержание = Содержание;
ДокОперация.Комментарий = Комментарий;
ДокОперация.Записать();
ДокОперацияСсылка = ДокОперация.Ссылка;
РегХозрасчетный = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
РегХозрасчетный.Отбор.Регистратор.Значение = ДокОперацияСсылка;
ДБФ.Первая();
Пока Не ДБФ.ВКонце() Цикл
КодКонтрагента = СокрП(ДБФ.CA);
Контрагент = Справочники.Контрагенты.НайтиПоКоду(КодКонтрагента);
Если Контрагент.Пустая() Тогда
Сообщить("Не найден контрагент с кодом " + КодКонтрагента, СтатусСообщения.Внимание);
КонецЕсли;
КодОС = СокрП(ДБФ.OS);
ОсновноеСредство = Справочники.ОсновныеСредства.НайтиПоКоду(КодОС);
Если ОсновноеСредство.Пустая() Тогда
Сообщить("Не найдено ОС с кодом " + КодОС, СтатусСообщения.Внимание);
КонецЕсли;
РегЗапись = РегХозрасчетный.Добавить();
РегЗапись.Период = ДатаДокумента;
РегЗапись.Регистратор = ДокОперацияСсылка;
РегЗапись.Организация = Организация;
РегЗапись.Содержание = "Корректировка стоимости ОС с 0 стоимостью";
РегЗапись.СчетДт = Сч001;
БухгалтерскийУчет.УстановитьСубконто(РегЗапись.СчетДт, РегЗапись.СубконтоДт, "Контрагенты", Контрагент);
БухгалтерскийУчет.УстановитьСубконто(РегЗапись.СчетДт, РегЗапись.СубконтоДт, "ОсновныеСредства", ОсновноеСредство);
РегЗапись.Сумма = ДБФ.Sum;
ДБФ.Следующая();
КонецЦикла;
РегХозрасчетный.Записать();
Я полагаю, принцип работы кода понятен из примера. Сначала создаем и записываем документ «Операция». Сам документ не содержит никаких проводок. Затем создаем набор записей регистра бухгалтерии и записываем в него проводки, используя документ «Операция» в качестве регистратора.
Источник Категория:
Документы Простое штрихкодирование документов Была поставлена задача на предприятии, где ежедневно выписывается по 300-500 накладных организовать штрихкодирование документов, для более удобной работы с бумажным носителем в дальнейшем. И вот результат…
Конфигурация “Торговля и склад”. Хотелось сделать как можно проще и быстрее, и в тоже время надежно. На решение задачи ушло 1,5 часа. И так приступим….
У нас будет использоваться штрихкод EAN13. Создаем общий реквизит документов:
Общий реквизит документов "EAN13"
Тип – “Строка”, длина – 13, отбор по реквизиту
Добавляем в глобальный модуль процедуру
Код 1C v 7.x //******************************************************************************
// глСформироватьШтрихкодДокумента(Конт)
//
// Параметры:
// Конт - контекст документа для которого необходимо сформировать штрихкод
// EAN13- реквизит документа содержащий штрихкод
// Возвращаемое значение:
// Нет
//
// Описание:
// На основании номера документа и вида документа формирует штрихкод в формате
// EAN
//
Процедура глСформироватьШтрихкодДокумента(Конт, EAN13) Экспорт
Если ПустаяСтрока(EAN13) = 1 Тогда
ПрефиксыДокументов = СоздатьОбъект("СписокЗначений");
ПрефиксыДокументов.ДобавитьЗначение("001", "Реализация");
ПрефиксыДокументов.ДобавитьЗначение("002", "СчетФактураВыданный");
// и т.д
КодДокумента = СокрЛП(Прав(Конт.НомерДок,7));
КодВидаДокумента = ПрефиксыДокументов.Получить(Конт.Вид());
Префикс = Прав(ДатаГод(Конт.ДатаДок), 2);
ИспКолво = 10;
Штрихкод = СимволыВЦифры(Прав(СокрЛП(КодДокумента+КодВидаДокумента),
ИспКолво));
Штрихкод = Префикс + глДополнитьСтрокуЛ(Штрихкод, "0", ИспКолво);
EAN13 = Штрихкод + глКонтрольныйСимволEAN(Штрихкод, 13);
КонецЕсли;
КонецПроцедуры // глСформироватьШтрихкодДокумента()
После этого в документы, которым будут присваиваться штрихкоды добавляем вызов
вышеописанного в процедуру "ПриЗаписи()"
Код 1C v 7.x Процедура ПриЗаписи()
//..............................
глСформироватьШтрихкодДокумента(Контекст, EAN13);
КонецПроцедуры
В результате при первой записи документа ему будет присвоен штрихкод состоящий
из следующих блоков:
1. год документа (2 символа);
2. семь цифр справа от номера документа;
3. код вида документа (3 символа);
4. контрольный символ;
Осталось только вставить в печатную форму объект ActiveBarcode и настроить
необходимые свойства у него.
А вот и результат
Автор:
Александр Шкураев Категория:
Штрих-код (barcode) Использование предложения ДЛЯ ИЗМЕНЕНИЯ Предложение
ДЛЯ ИЗМЕНЕНИЯ позволяет заблаговременно заблокировать некоторые данные (которые могут читаться транзакцией другого соединения) уже при считывании, чтобы исключить взаимные блокировки при записи. ДЛЯ ИЗМЕНЕНИЯ дает возможность указать в запросе таблицы, считываемые данные которых предполагается изменять. В этом случае другое соединение будет ожидать освобождения этих данных уже в момент считывания внутри транзакции, т.е. не сможет прочесть заблокированные данные до тех пор, пока не будет завершена транзакция, наложившая блокировку. Блокировка от изменения данных считываемых в транзакции выполняется независимо от предложения
ДЛЯ ИЗМЕНЕНИЯ . Это значит, что если внутри какой-либо транзакции считаны некоторые данные, то из другого соединения эти данные не могут быть изменены до тех пор, пока блокировка не будет снята. Если запрос выполняется вне транзакции, то в нем могут быть считаны и заблокированные данные.
Блокировки устанавливаются в момент выполнения запроса, сбрасываются же при окончании транзакции. В случае если запрос выполняется вне транзакции предложение
ДЛЯ ИЗМЕНЕНИЯ игнорируется.
В случае если после предложения
ДЛЯ ИЗМЕНЕНИЯ отсутствуют имена таблиц, блокироваться будут считанные данные из всех таблиц, задействованных в запросе. В случае указания конкретных таблиц будут блокироваться только данные из перечисленных таблиц. Для блокировки можно указывать только таблицы верхнего уровня (т.е. не табличные части), участвующие в запросе. Должны приводиться именно имена таблиц, а не их псевдонимы, определенные в запросе. В случае указания виртуальной таблицы будут блокированы данные из всех таблиц, задействованных в виртуальной таблице. При указании виртуальной таблицы следует записывать ее имя без параметров.
Пример использования предложения
ДЛЯ ИЗМЕНЕНИЯ можно посмотреть в типовой конфигурации "Управление торговлей" в модуле документа РеализацияТоваров, в функции СформироватьЗапросПоШапке(Режим), которая вызывается из обработчика проведения документа. В этой функции, в случае оперативного проведения выполняется запрос, в котором накладывается блокировка на регистр остатков:
Код 1C v 8.х ВЫБРАТЬ
Док.Дата,
Док.Ссылка,
Док.ВидОперации,
Док.Организация,
Док.ОтражатьВРегламентированномУчете,
Док.ОтражатьВУправленческомУчете,
Док.ПодразделениеКомпании,
Док.Контрагент,
Док.ДоговорВзаиморасчетов,
Док.СкладКомпании,
Док.Сделка,
Док.Сделка.ВидОперации КАК ВидЗаказаПокупателя,
Док.КурсДокумента,
Док.КратностьДокумента,
Док.ВалютаДокумента,
Док.СуммаДокумента,
Док.КурсВзаиморасчетов,
Док.КратностьВзаиморасчетов,
Док.СкладКомпании.Розничный КАК СкладКомпанииРозничный,
Док.ДоговорВзаиморасчетов.ВалютаВзаиморасчетов КАК ВалютаВзаиморасчетов,
Док.ДоговорВзаиморасчетов.ВедениеВзаиморасчетов КАК ВедениеВзаиморасчетов,
Док.ДоговорВзаиморасчетов.КонтролироватьЧислоДнейЗадолженности
КАК КонтролироватьЧислоДнейЗадолженности,
Док.ДоговорВзаиморасчетов.ДопустимоеЧислоДнейЗадолженности
КАК ДопустимоеЧислоДнейЗадолженности,
Док.ДоговорВзаиморасчетов.КонтролироватьСуммуЗадолженности
КАК КонтролироватьСуммуЗадолженности,
Док.ДоговорВзаиморасчетов.ДопустимаяСуммаЗадолженности
КАК ДопустимаяСуммаЗадолженности,
Док.ДоговорВзаиморасчетов.ПроцентПредоплаты КАК ПроцентПредоплаты,
Док.УчитыватьНДС,
Док.УчитыватьНП,
Док.СуммаВключаетНДС,
Док.СуммаВключаетНП,
Константы.ВалютаУправленческогоУчетаКомпании КАК ВалютаУправленческогоУчета,
КурсыВалютСрезПоследних.Курс КАК КурсВалютыУпрУчета,
КурсыВалютСрезПоследних.Кратность КАК КратностьВалютыУпрУчета,
ВзаиморасчетыПоДоговору.СуммаВалОстаток КАК СуммаВалОстатокПоДоговору,
ВзаиморасчетыПоСделке.СуммаВалОстаток КАК СуммаВалОстатокПоСделке,
ПерваяСделка.ДатаПервойСделки,
СуммыЗаказов.СуммаЗаказаОборот,
СуммыЗаказов.СуммаОплатыОборот
ИЗ
Документ.РеализацияТоваров Док,
Константы
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&ДатаДокумента,)
КАК КурсыВалютСрезПоследних
ПО Константы.ВалютаУправленческогоУчетаКомпании = КурсыВалютСрезПоследних.Валюта
ЛЕВОЕ СОЕДИНЕНИЕ // Для контроля суммы задолженности по договору
// (ведение взаиморасчетов - любое) и числа дней задолженности по договору
// (ведение взаиморасчетов - по расчетным документам)
РегистрНакопления.КонтрагентыВзаиморасчетыКомпании.Остатки(,
ДоговорВзаиморасчетов = &ДоговорВзаиморасчетов)
КАК ВзаиморасчетыПоДоговору
ПО Истина
ЛЕВОЕ СОЕДИНЕНИЕ
(ВЫБРАТЬ // Выбирает даты самых ранних сделок по договорам, указанным в т.ч.
МИНИМУМ(Сделка.Дата) КАК ДатаПервойСделки,
ДоговорВзаиморасчетов
ИЗ РегистрНакопления.КонтрагентыВзаиморасчетыКомпании.Остатки(,
ДоговорВзаиморасчетов = &ДоговорВзаиморасчетов)
ГДЕ СуммаВалОстаток > 0 // Дебиторская задолженность больше 0
И ДоговорВзаиморасчетов.ВедениеВзаиморасчетов = &ПоРасчетнымДокументам
И ДоговорВзаиморасчетов.КонтролироватьЧислоДнейЗадолженности
СГРУППИРОВАТЬ ПО ДоговорВзаиморасчетов) КАК ПерваяСделка
ПО Истина
ЛЕВОЕ СОЕДИНЕНИЕ // Для контроля суммы задолженности по расчетному документу
//(ведение взаиморасчетов - по расчетным документам)
РегистрНакопления.КонтрагентыВзаиморасчетыКомпании.Остатки(,
ДоговорВзаиморасчетов = &ДоговорВзаиморасчетов
И Сделка = &Сделка
) КАК ВзаиморасчетыПоСделке
ПО Истина
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрНакопления.СуммыЗаказов.Обороты(,,, Заказ = &Сделка) КАК СуммыЗаказов
ПО Истина
ГДЕ
Док.Ссылка = &ДокументСсылка
ДЛЯ ИЗМЕНЕНИЯ РегистрНакопления.КонтрагентыВзаиморасчетыКомпании.Остатки
// Блокирующие чтение таблицы остатков регистра для разрешения
// коллизий многопользовательской работы
Категория:
Запросы Загрузка данных из текстовых файлов с выборкой через ADO. Часто бывает потребность загружать данные из текстовых форматов, причем информация для загрузки бьется на 2 и более файлов.
Хорошо бы посредством SQL запроса выбирать данные из этих файлов и производить загрузку! Это вполне возможно и я считаю этот способ наиболее грамотный для решения таких задач!
Имеем 2 файла:
- Head_XXXXX.txt
- Rows_XXXXX.txt
Где XXXXX – порядковой номер пары файлов
Структура строки в Head_XXXXX.txt :
Колонка1 20 символов – Номер заказа
Колонка2 5 символов – Код контрагента
Колонка3 10 символов – Дата заказа
Колонка4 10 символов – Дата доставки
Колонка5 10 символов – Дата сбора
Колонка6 4 символов – Количество строк в ТЧ
Структура строки в Rows_XXXXX.txt :
Колонка1 20 символов – Номер заказа
Колонка2 7 символов – Артикул номенклатуры
Колонка3 9 символов – Количество в базовых ед. изм.
В каждой паре файлов несколько Заказов.
Необходимо загрузить эти заказы в БД 1С
Для этого воспользуемся Microsoft.Jet.OLEDB.4.0
Для того чтоб данный драйвер корректно понимал структуру файлов необходимо в каталоге расположения данных файлов, перед выполнением запросов, создать специальный текстовый файл schema.ini cо следующими строками:
Код [ Head_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=StoreNum Text Width 5
Col3=DataNote DateTime Width 10
Col4=DataDev DateTime Width 10
Col5=DataDes DateTime Width 10
Col6=CountLine Long Width 4
[Rows_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=Articul Text Width 7
Col3=Counts Double Width 9
Как видим, здесь мы задаем структуру таблицы из файла.
Остается только выполнить запрос к полученной текстовой БД и обработать результат:
Ниже приведен пример кода для платформы 1С 8:
Код 1C v 8.х // Загружает данные из текстовых данных
// Параметры
// Стр_КаталогДанных - <Строка>
// Автор: Gmix 04.05.2006 12:22:09
// Возвращаемое значение:
// <Булево>
Функция ЗагрузитьДанныеИзtxt(Стр_КаталогДанных)
// проверки заполнения
ОБ_ФайлДанных=Новый Файл(Стр_КаталогДанных);
Если НЕ ОБ_ФайлДанных.ЭтоКаталог() Тогда
Сообщить("Необходимо указать каталог данных!",СтатусСообщения.ОченьВажное);
Возврат Ложь;
КонецЕсли;
Если НЕ ОБ_ФайлДанных.Существует() Тогда
Сообщить("Каталог """+Стр_КаталогДанных+""" не существует!",СтатусСообщения.ОченьВажное);
Возврат Ложь;
КонецЕсли;
ОБ_АДОКонект = Новый COMОбъект("ADODB.Connection");
ОБ_АДОРекордсетШапка = Новый COMОбъект("ADODB.Recordset");
ОБ_АДОРекордсетСтроки = Новый COMОбъект("ADODB.Recordset");
//Определяем пару файлов
Стр_ОкончаниеФайла="";
ФайлыШапок = НайтиФайлы(Стр_КаталогДанных, "Head_*.txt");
Для каждого ФайлШапки Из ФайлыШапок Цикл
Стр_ОкончаниеФайла=Сред(ФайлШапки.ИмяБезРасширения,6);
Стр_таблицаШапки=ФайлШапки.Имя;
Стр_ТаблицаСтрок="Rows_"+Стр_ОкончаниеФайла+".txt";
Стр_ИмяФайлСтрок=ДобавлениеСлеша(Стр_КаталогДанных)+Стр_ТаблицаСтрок;
ФайлСтрок=Новый Файл(Стр_ИмяФайлСтрок);
Если НЕ ФайлСтрок.Существует() Тогда
Сообщить("Не найден файл строк для файла шапки """+Стр_таблицаШапки+"""! Пара файлов не обработана",СтатусСообщения.Важное);
Продолжить;
КонецЕсли;
//Создаем схему данных
ФайлСхемыДанных=Новый Файл(ДобавлениеСлеша(Стр_КаталогДанных)+"schema.ini");
Если ФайлСхемыДанных.Существует() Тогда
Попытка
УдалитьФайлы(ФайлСхемыДанных.Путь,ФайлСхемыДанных.Имя);
Исключение
Сообщить("Не возможно удалить файл """+ФайлСхемыДанных.ПолноеИмя+""" для создания новой схемы данных! Проверте атрибуты файла",СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
КонецЕсли;
Стр_СхемаДанныхТхт="["+Стр_таблицаШапки+"]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=StoreNum Text Width 5
|Col3=DataNote DateTime Width 10
|Col4=DataDev DateTime Width 10
|Col5=DataDes DateTime Width 10
|Col6=CountLine Long Width 4
|["+Стр_ТаблицаСтрок+"]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=Articul Text Width 7
|Col3=Counts Double Width 9";
ТекстСхемы=Новый ЗаписьТекста(ФайлСхемыДанных.ПолноеИмя, КодировкаТекста.ANSI);
ТекстСхемы.Записать(Стр_СхемаДанныхТхт);
ТекстСхемы.Закрыть();
// Создаем коннект
Попытка
ОБ_АДОКонект.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Стр_КаталогДанных+";Extended Properties='text;FMT=Delimited;HDR=NO'");
Исключение
Сообщить("Невозможно открыть соединение!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Стр_SQL = "S_elect * FROM "+Стр_таблицаШапки;
Попытка
ОБ_АДОРекордсетШапка=ОБ_АДОКонект.Execute(Стр_SQL);
Исключение
Сообщить("Ошибка выполнения запроса """+Стр_SQL+"""!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Пока НЕ ОБ_АДОРекордсетШапка.EOF Цикл
// Заказ
Стр_НомерЗаказа = ОБ_АДОРекордсетШапка.Fields("NumberNote").Value;
Стр_КодКА= ОБ_АДОРекордсетШапка.Fields("StoreNum").Value;
Д_ДатаЗаказа= ОБ_АДОРекордсетШапка.Fields("DataNote").Value;
Д_ДатаДоставки= ОБ_АДОРекордсетШапка.Fields("DataDev").Value;
Д_ДатаСбора= ОБ_АДОРекордсетШапка.Fields("DataDes").Value;
Ч_КоличествоСтрок = ОБ_АДОРекордсетШапка.Fields("CountLine").Value;
Сообщить("Заказ № "+Стр_НомерЗаказа+" от " +Д_ДатаЗаказа+ " Код контрагента: "+Стр_КодКА+" Дата доставки: "+Д_ДатаДоставки);
// Обработка строк заказа
Стр_SQL = "S_elect * FROM "+Стр_ТаблицаСтрок+" WHERE NumberNote='"+Стр_НомерЗаказа+"'";
Попытка
ОБ_АДОРекордсетСтроки=ОБ_АДОКонект.Execute(Стр_SQL);
Исключение
Сообщить("Ошибка выполнения запроса """+Стр_SQL+"""!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Сч=0;
Сообщить(" № Артикул Количество");
Пока НЕ ОБ_АДОРекордсетСтроки.EOF Цикл
//Заполняем таб часть документа
Сч=Сч+1;
Стр_Артикул=СокрЛП(ОБ_АДОРекордсетСтроки.Fields("Articul").Value);
Ч_Количество=ОБ_АДОРекордсетСтроки.Fields("Counts").Value;
Сообщить(""+Сч+" " +Стр_Артикул+ " "+Ч_Количество);
ОБ_АДОРекордсетСтроки.MoveNext();
КонецЦикла;
ОБ_АДОРекордсетШапка.MoveNext();
КонецЦикла;
КонецЦикла;
Возврат Истина;
КонецФункции
Автор
Журавлев Михаил Викторович Категория:
JSON, XML, TXT, CSV, DBF Пример переноса данных из 1С 7.7 в 8.1 посредством XML файла Код 1C v 7.x xmldoc = CreateObject("Msxml2.DOMDocument");
xmlDoc.loadXML("<root/>");
nodeRoot = xmlDoc.documentElement;
расходы = xmlDoc.createElement("СправочникРасходы");
Спр = Создатьобъект("Справочник.Расходы");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 цикл
расход = xmlDoc.createElement("Расход");
расход.setAttribute("Код",Спр.Код);
расход.setAttribute("Наименование",Спр.Наименование);
расход.setAttribute("Родитель",Строка(Спр.Родитель));
расход.setAttribute("Цена",Строка(Спр.Цена.Получить(ТекущаяДата())));
расход.setAttribute("Количество",Строка(Спр.Количество));
расход.setAttribute("ЭтоГруппа",Строка(Спр.ЭтоГруппа()));
расходы.appendChild(расход);
КонецЦикла;
nodeRoot.appendChild(расходы);
ДвижениеСчетов = xmlDoc.createElement("ДвижениеСчетов");
рег = СоздатьОбъект("Регистр.Счет");
рег.ВыбратьДвижения();
Пока Рег.ПолучитьДвижение()=1 цикл
Движение = xmlDoc.createElement("Движение");
Движение.setAttribute("Приход",Строка(Рег.Приход));
Движение.setAttribute("Дата",Строка(Рег.ТекущийДокумент().ДатаДок));
Движение.setAttribute("Описатель",Строка(Рег.Описатель));
Движение.setAttribute("СтатьяРасходов",Строка(Рег.СтатьяРасходов));
Движение.setAttribute("СтатьяПоступлений",Строка(Рег.СтатьяПоступлений));
Движение.setAttribute("Кто",Строка(Рег.Кто));
Движение.setAttribute("Кому",Строка(Рег.Кому));
Движение.setAttribute("Остаток",Строка(Рег.Остаток));
Движение.setAttribute("Количество",Строка(Рег.Количество));
ДвижениеСчетов.appendChild(Движение);
КонецЦикла;
nodeRoot.appendChild(ДвижениеСчетов);
xmlDoc.save("C:\budjet.xml");
Код 1C v 8.х
Функция Кошель(Кош)
стр = ТП2.Найти(Кош,"Описатель");
Возврат Стр.Счет;
КонецФункции
Функция Вал(Кош)
стр = ТП2.Найти(Кош,"Описатель");
Возврат Стр.Валюта;
КонецФункции
Функция Дата1С(дат)
Возврат "20"+сред(дат,7,2)+сред(дат,4,2)+лев(дат,2);
КонецФункции
Процедура Загрузка(Элемент)
xmlDoc = Новый COMОбъект("MSXML2.DOMDocument");
xmlDoc.load("C:\budjet.xml");
nodeRoot = xmlDoc.documentElement;
Для каждого nod из nodeRoot.childNodes цикл
Если nod.nodeName = "СправочникРасходы" тогда
Сообщить("нашли СправочникРасходы");
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Код");
ТЗ.Колонки.Добавить("Наименование");
ТЗ.Колонки.Добавить("Родитель");
ТЗ.Колонки.Добавить("Цена");
ТЗ.Колонки.Добавить("Количество");
ТЗ.Колонки.Добавить("ЭтоГруппа");
Для Каждого Расход из nod.childNodes Цикл
Строка = ТЗ.Добавить();
Строка.Код = Расход.getAttribute("Код");
Строка.Наименование = Расход.getAttribute("Наименование");
Строка.Родитель = Расход.getAttribute("Родитель");
Строка.Цена = Число(Расход.getAttribute("Цена"));
Строка.Количество = Число(Расход.getAttribute("Количество"));
Строка.ЭтоГруппа = ?(Расход.getAttribute("ЭтоГруппа")="1",True,Ложь);
КонецЦикла;
//ТЗ.ВыбратьСтроку();
Для Каждого Стр из ТЗ Цикл
Родитель = Справочники.СтатьиЗатрат.НайтиПоНаименованию(Стр.Родитель,истина);
Справ = Справочники.СтатьиЗатрат.НайтиПоНаименованию(Стр.Наименование,истина);
Если Справ = Справочники.СтатьиЗатрат.ПустаяСсылка() тогда
Если Стр.ЭтоГруппа тогда
Справ = Справочники.СтатьиЗатрат.СоздатьГруппу();
Справ.Код = Стр.Код;
Справ.Наименование = Стр.Наименование;
Справ.Родитель = Родитель;
Справ.Записать();
Иначе
Справ = Справочники.СтатьиЗатрат.СоздатьЭлемент();
Справ.Код = Стр.Код;
Справ.Наименование = Стр.Наименование;
Справ.Родитель = Родитель;
Справ.Цена = Стр.Цена;
Справ.Количество = Стр.Количество;
Справ.Записать();
КонецЕсли;
Иначе
КонецЕсли;
КонецЦикла;
ИначеЕсли nod.nodeName = "ДвижениеСчетов" тогда
Сообщить("нашли движения счетов");
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Приход");
ТЗ.Колонки.Добавить("Дата");
ТЗ.Колонки.Добавить("Описатель");
ТЗ.Колонки.Добавить("Статья");
ТЗ.Колонки.Добавить("Цена");
ТЗ.Колонки.Добавить("Количество");
Для каждого движ из nod.childNodes цикл
Строка = ТЗ.Добавить();
Строка.Приход = ?(движ.getAttribute("Приход")="1",True,Ложь);
Строка.Дата = Дата(Дата1С(движ.getAttribute("Дата")));
Строка.Описатель = движ.getAttribute("Описатель");
Строка.Статья = Справочники.СтатьиЗатрат.НайтиПоНаименованию(движ.getAttribute(?(Строка.Приход,"СтатьяПоступлений","СтатьяРасходов")),истина);
Строка.Цена = Число(движ.getAttribute("Остаток"));
Строка.Количество = Число(движ.getAttribute("Количество"));
КонецЦикла;
ТЗ.ВыбратьСтроку();
Доки = Новый ТаблицаЗначений;
Доки.Колонки.Добавить("Док");
Доки.Колонки.Добавить("Дата");
Доки.Колонки.Добавить("КошелекС");
Доки.Колонки.Добавить("КошелекНа");
Доки.Колонки.Добавить("Статья");
Доки.Колонки.Добавить("ВалютаС");
Доки.Колонки.Добавить("ВалютаНа");
Доки.Колонки.Добавить("ЦенаС");
Доки.Колонки.Добавить("ЦенаНа");
Доки.Колонки.Добавить("Количество");
УжеЕстьДок=Ложь;
док=0;
Для Каждого Стр Из ТЗ цикл
Если Стр.Приход Тогда
Если УжеЕстьДок тогда
Док.КошелекНа = Кошель(Стр.Описатель);
Док.ВалютаНа = Вал(Стр.Описатель);
Док.ЦенаНа = Стр.Цена;
Док.Количество = Стр.Количество;
Док.Статья = Стр.Статья;
УжеЕстьДок=Ложь;
Иначе
Док = Доки.Добавить();
Док.КошелекНа = Кошель(Стр.Описатель);
Док.ВалютаНа = Вал(Стр.Описатель);
Док.ЦенаНа = Стр.Цена;
Док.Количество = Стр.Количество;
Док.Статья = Стр.Статья;
Док.Док = "ПоступлениеСредств";
КонецЕсли;
Иначе
Док = Доки.Добавить();
Док.КошелекС = Кошель(Стр.Описатель);
Док.ВалютаС = Вал(Стр.Описатель);
Док.ЦенаС = Стр.Цена;
Док.Количество = Стр.Количество;
Док.Статья = Стр.Статья;
Если СокрЛП(Стр.Статья.Наименование)="Обмен валюты" тогда
Док.Док = "ОбменВалюты";
УжеЕстьДок=истина;
ИначеЕсли СокрЛП(Стр.Статья.Наименование)="Перевод средств" тогда
Док.Док = "ПереводСредств";
УжеЕстьДок=истина;
Иначе
Док.Док = "РасходСредств";
УжеЕстьДок=Ложь;
КонецЕсли;
КонецЕсли;
Док.Дата = Стр.Дата;
КонецЦикла;
Доки.ВыбратьСтроку();
КонецЕсли;
КонецЦикла;
Для Каждого Док из Доки Цикл
Если Док.Док = "ПоступлениеСредств" тогда
Докум = Документы.ПоступлениеСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.Кошелек = Док.КошелекНа;
Докум.Валюта = Док.ВалютаНа;
Докум.Сумма = Док.ЦенаНа;
Докум.Статья = Док.Статья;
Докум.Записать(РежимЗаписиДокумента.Проведение);
ИначеЕсли Док.Док = "ПереводСредств" тогда
Докум = Документы.ПеремещениеСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.КошелекКуда = Док.КошелекНа;
Докум.КошелекОтКуда = Док.КошелекС;
Докум.Валюта = Док.ВалютаНа;
Докум.Сумма = Док.ЦенаНа;
Докум.Записать(РежимЗаписиДокумента.Проведение);
ИначеЕсли Док.Док = "ОбменВалюты" тогда
Докум = Документы.ПеремещениеСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.КошелекКуда = Док.КошелекНа;
Докум.КошелекОтКуда = Док.КошелекС;
Докум.Валюта = Док.ВалютаС;
Докум.Сумма = Док.ЦенаС;
Докум.Записать(РежимЗаписиДокумента.Проведение);
Докум = Документы.ОбменВалюты.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.Кошелек = Док.КошелекНа;
Докум.ВалютаС = Док.ВалютаС;
Докум.ВалютаНа = Док.ВалютаНа;
Докум.СуммаС = Док.ЦенаС;
Докум.СуммаНа = Док.ЦенаНа;
Докум.Курс = Докум.СуммаС / Докум.СуммаНа;
Докум.Переключатель = 1;
Докум.Записать(РежимЗаписиДокумента.Проведение);
Иначе
Докум = Документы.РасходСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.Кошелек = Док.КошелекС;
Докум.Валюта = Док.ВалютаС;
тч = Докум.Затраты.Добавить();
тч.Сумма = Док.ЦенаС;
тч.Статья = Док.Статья;
тч.Цена = Док.ЦенаС;
тч.Количество = Док.Количество;
Докум.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьТЗДанными(Элемент)
xmlDoc = Новый COMОбъект("MSXML2.DOMDocument");
xmlDoc.load("C:\budjet.xml");
nodeRoot = xmlDoc.documentElement;
Для каждого nod из nodeRoot.childNodes цикл
Если nod.nodeName = "ДвижениеСчетов" тогда
Сообщить("нашли движения счетов");
ТП1 = Новый ТаблицаЗначений;
ТП1.Колонки.Добавить("Описатель");
Типы = Новый Массив(1); Типы[0] = Тип("СправочникСсылка.Кошельки");
Тип = Новый ОписаниеТипов(Типы);
ТП1.Колонки.Добавить("Счет",Тип);
Типы[0] = Тип("СправочникСсылка.Валюты");
Тип = Новый ОписаниеТипов(Типы);
ТП1.Колонки.Добавить("Валюта",Тип);
Для каждого движ из nod.childNodes цикл
Описатель = движ.getAttribute("Описатель");
если ТП1.Найти(Описатель,"Описатель") = Неопределено тогда
стр = ТП1.Добавить();
Стр.Описатель = Описатель;
КонецЕсли;
КонецЦикла;
ТП2=ТП1;//ВыбратьСтроку();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Категория:
JSON, XML, TXT, CSV, DBF