Как декодировать (преобразовать) Unicode в 1С При разработке очередного обмена с интернет магазином через API столкнулисть что сайт возвращает ответ в виде:
Код VBS {"ok" :"true" ,"description" :"\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d" }
из кода ясно что это JSON и используя код ПрочитатьJSON
Код 1C v 8.3 Чтение = Новый ЧтениеJSON;
Чтение. УстановитьСтроку( стрВходящая) ;
ДанныеЛога = ПрочитатьJSON( Чтение) ;
Чтение. Закрыть( ) ;
В переменной ДанныеЛога будет структура в виде
В результате получилась функция с 2-мя вариантами возрата, в зависимости от того как нужно
Код 1C v 8.3
Функция ДекодироватьUniCodeВJSON(стрВходящая)
Чтение = Новый ЧтениеJSON;
Чтение. УстановитьСтроку( стрВходящая) ;
ДанныеЛога = ПрочитатьJSON( Чтение) ;
Чтение. Закрыть( ) ;
Текст = "" ;
Для каждого Элемент Из ДанныеЛога Цикл
Текст = Текст + ? ( НЕ ПустаяСтрока( Текст) , Символы. ПС, "" ) ;
Текст = Текст + Элемент. Ключ + " = " + Элемент. Значение;
КонецЦикла ;
Возврат Текст;
Запись = Новый ЗаписьJSON;
Запись. УстановитьСтроку( Новый ПараметрыЗаписиJSON( ПереносСтрокJSON. Нет) ) ;
ЗаписатьJSON( Запись, ДанныеЛога, ) ;
Возврат Запись. Закрыть( ) ;
КонецФункции
На просторах интернета была найдена еще одна функция:
Код 1C v 8.3
Функция ПереобразоватьЮникод(Строка)
ГотововаяСтрока = "" ;
МасУкр = Новый Массив( 66 ) ;
МасУкр[0 ]= "А" ; МасУкр[1 ]= "Б" ; МасУкр[2 ]= "В" ; МасУкр[3 ]= "Г" ; МасУкр[4 ]= "Ґ" ; МасУкр[5 ]= "Д" ;
МасУкр[6 ]= "Е" ; МасУкр[7 ]= "Є" ; МасУкр[8 ]= "Ж" ; МасУкр[9 ]= "З" ; МасУкр[10 ]= "И" ; МасУкр[11 ]= "І" ;
МасУкр[12 ]= "Ї" ; МасУкр[13 ]= "Й" ; МасУкр[14 ]= "К" ; МасУкр[15 ]= "Л" ; МасУкр[16 ]= "М" ; МасУкр[17 ]= "Н" ;
МасУкр[18 ]= "О" ; МасУкр[19 ]= "П" ; МасУкр[20 ]= "Р" ; МасУкр[21 ]= "С" ; МасУкр[22 ]= "Т" ; МасУкр[23 ]= "У" ;
МасУкр[24 ]= "Ф" ; МасУкр[25 ]= "Х" ; МасУкр[26 ]= "Ц" ; МасУкр[27 ]= "Ч" ; МасУкр[28 ]= "Ш" ; МасУкр[29 ]= "Щ" ;
МасУкр[30 ]= "Ь" ; МасУкр[31 ]= "Ю" ; МасУкр[32 ]= "Я" ;
МасУкр[33 ]= "а" ; МасУкр[34 ]= "б" ; МасУкр[35 ]= "в" ; МасУкр[36 ]= "г" ; МасУкр[37 ]= "ґ" ; МасУкр[38 ]= "д" ;
МасУкр[39 ]= "е" ; МасУкр[40 ]= "є" ; МасУкр[41 ]= "ж" ; МасУкр[42 ]= "з" ; МасУкр[43 ]= "и" ; МасУкр[44 ]= "і" ;
МасУкр[45 ]= "ї" ; МасУкр[46 ]= "й" ; МасУкр[47 ]= "к" ; МасУкр[48 ]= "л" ; МасУкр[49 ]= "м" ; МасУкр[50 ]= "н" ;
МасУкр[51 ]= "о" ; МасУкр[52 ]= "п" ; МасУкр[53 ]= "р" ; МасУкр[54 ]= "с" ; МасУкр[55 ]= "т" ; МасУкр[56 ]= "у" ;
МасУкр[57 ]= "ф" ; МасУкр[58 ]= "х" ; МасУкр[59 ]= "ц" ; МасУкр[60 ]= "ч" ; МасУкр[61 ]= "ш" ; МасУкр[62 ]= "щ" ;
МасУкр[63 ]= "ь" ; МасУкр[31 ]= "ю" ; МасУкр[65 ]= "я" ;
МасКод = Новый Массив( 66 ) ;
МасКод[0 ]= "0410" ; МасКод[1 ]= "0411" ; МасКод[2 ]= "0412" ; МасКод[3 ]= "0413" ; МасКод[4 ]= "0490" ; МасКод[5 ]= "0414" ;
МасКод[6 ]= "0415" ; МасКод[7 ]= "0404" ; МасКод[8 ]= "0416" ; МасКод[9 ]= "0417" ; МасКод[10 ]= "0418" ; МасКод[11 ]= "0406" ;
МасКод[12 ]= "0407" ; МасКод[13 ]= "0419" ; МасКод[14 ]= "041A" ; МасКод[15 ]= "041B" ; МасКод[16 ]= "041C" ; МасКод[17 ]= "041D" ;
МасКод[18 ]= "041E" ; МасКод[19 ]= "041F" ; МасКод[20 ]= "0420" ; МасКод[21 ]= "0421" ; МасКод[22 ]= "0422" ; МасКод[23 ]= "0423" ;
МасКод[24 ]= "0424" ; МасКод[25 ]= "0425" ; МасКод[26 ]= "0426" ; МасКод[27 ]= "0427" ; МасКод[28 ]= "0428" ; МасКод[29 ]= "0429" ;
МасКод[30 ]= "042C" ; МасКод[31 ]= "042E" ; МасКод[32 ]= "042F" ;
МасКод[33 ]= "0430" ; МасКод[34 ]= "0431" ; МасКод[35 ]= "0432" ; МасКод[36 ]= "0413" ; МасКод[37 ]= "0491" ; МасКод[38 ]= "0434" ;
МасКод[39 ]= "0435" ; МасКод[40 ]= "0454" ; МасКод[41 ]= "0436" ; МасКод[42 ]= "0437" ; МасКод[43 ]= "0438" ; МасКод[44 ]= "0456" ;
МасКод[45 ]= "0457" ; МасКод[46 ]= "0439" ; МасКод[47 ]= "043A" ; МасКод[48 ]= "043B" ; МасКод[49 ]= "043C" ; МасКод[50 ]= "043D" ;
МасКод[51 ]= "043E" ; МасКод[52 ]= "043F" ; МасКод[53 ]= "0440" ; МасКод[54 ]= "0441" ; МасКод[55 ]= "0442" ; МасКод[56 ]= "0443" ;
МасКод[57 ]= "0444" ; МасКод[58 ]= "0445" ; МасКод[59 ]= "0446" ; МасКод[60 ]= "0447" ; МасКод[61 ]= "0448" ; МасКод[62 ]= "0449" ;
МасКод[63 ]= "044C" ; МасКод[31 ]= "044E" ; МасКод[65 ]= "044F" ;
тмпСтрока = "" ;
Для Счетчик = 1 По СтрДлина( Строка) Цикл
Если Лев( Строка, 1 ) = "\" Тогда
Если Лев( Строка, 2 ) = "\u" Тогда
тмпСтрока = Прав( Лев( Строка, 6 ) , 4 ) ;
Если МасКод. Найти( тмпСтрока) = Неопределено Тогда
СтрокаЗамены = Прав( тмпСтрока, 1 ) ;
тмпСтрока = СтрЗаменить( тмпСтрока, СтрокаЗамены, ТРег( СтрокаЗамены) ) ;
Если МасКод. Найти( тмпСтрока) = Неопределено Тогда
Сообщить( "Код символа не найден: " + тмпСтрока) ;
Иначе
ГотововаяСтрока = ГотововаяСтрока + МасУкр[МасКод. Найти( тмпСтрока) ] ;
КонецЕсли ;
Иначе
ГотововаяСтрока = ГотововаяСтрока + МасУкр[МасКод. Найти( тмпСтрока) ] ;
КонецЕсли ;
Строка = Прав( Строка, ( СтрДлина( Строка) - 6 ) ) ;
Иначе
Строка = Прав( Строка, ( СтрДлина( Строка) - 2 ) ) ;
КонецЕсли ;
Иначе
ГотововаяСтрока = ГотововаяСтрока + Лев( Строка, 1 ) ;
Строка = Прав( Строка, ( СтрДлина( Строка) - 1 ) ) ;
КонецЕсли ;
КонецЦикла ;
Возврат ГотововаяСтрока ;
КонецФункции
Категория:
WEB-сервисы, WS-ссылки, XDTO-пакеты Как строку вида 2023-07-24T15:35:34+03:00 (формат ISO 8601) преобразовать в дату? Стандарт ISO 8601, составлен таким образом, что:
Строка даты-времени сплошная без пробельных разделителей Латинские символы используются в качестве разделителей/идентификаторов: D - дни, Y - годы, Z - идентификатор UTC и т.д., например можно задать промежуток времени: P4Y3M2D1H - 4 года, 3 месяца, 2 дня и 1 час. Буква T выбрана в качестве уникального разделителя времени, остальные буквы латинского алфавита (почти все) задействованы под разные цели и они не пересекаются. Соответственно упрощается парсинг ISO-8601 строки: имеется заранее известный набор флагов/символов/маркеров, опираясь на которые, можно достаточно быстро разбить строку на нужные составляющие и при этом сохраняется требование к human readability самой строки.
Конвертация даты из формата ISO8601 в дату 1С:
Код 1C v 8.3
Дата1 С = XMLЗначение( Тип( "Дата" ) , "2023-07-24T15:35:34+03:00" ) ;
Функция КонвертироватьДатуISO8601ВДату(Дата) Экспорт
КонвертированнаяДата = Новый Структура( "Дата, Миллисекунды" ) ;
АвтоконвертированнаяДата = XMLЗначение( Тип( "Дата" ) , Дата) ;
Миллисекунды = Сред( Дата, 21 ) ;
Миллисекунды = СокрЛП( СтрЗаменить( Миллисекунды, "Z" , "" ) ) ;
Если НЕ ПустаяСтрока( Миллисекунды) Тогда
ЧислоМиллисекунд = Число( Миллисекунды) ;
Если ЧислоМиллисекунд > = 500 Тогда
АвтоконвертированнаяДата = АвтоконвертированнаяДата - 1 ;
КонецЕсли ;
КонецЕсли ;
КонвертированнаяДата. Дата = АвтоконвертированнаяДата;
КонвертированнаяДата. Миллисекунды = Миллисекунды;
Возврат КонвертированнаяДата;
КонецФункци
Категория:
Работа с Датами (Временем) Функции сохранения таблицы значений в файл и чтения из файла В данном примере хочу привести несколько универсальных функций по выгрузке таблицы значений в файл и дальнейшего чтения из файла:
П орядок программных действий при выгрузке в файл выглядит так:
Подготавливаем таблицу значений (выгружаем из табличной части, выбираем колонки); Конвертируем таблицу значений в табличный документ; Сохраняем табличный документ в MXL.
При загрузке таблицы порядок действий такой:
Читаем из файла табличный документ; Конвертируем табличный документ в таблицу значений; Используем эту таблицу значений в своих целях (загружаем в табличную часть).
Соответственно файл для хранения данных таблицы имеет расширение *.mxl.
Основные функции для реализации поставленной задачи следующие:
ПреобразоватьТДвТЗ – Функция преобразования табличного документа в таблицу значений.
ПреобразоватьТЗвТД – Функция обратного преобразования таблицы значений в табличный документ.
ПрочитатьТЗИзMXL – Читает из файла данные, определяет колонки таблицы и преобразует эти данные в таблицу значений.
ЗаписатьТЗВMXL – Преобразует таблицу значений в табличный документ и записывает его в файл.
Код 1C v 8.3
Функция ПреобразоватьТДвТЗ(ТабДок, СтруктураКолонок, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, Знач КонецСтрока = Неопределено, Знач КонецСтолбец = Неопределено) Экспорт
Если НачалоСтрока = Неопределено И НачалоСтолбец = Неопределено Тогда
НачалоСтрока = 1 ;
НачалоСтолбец = 1 ;
КонецЕсли ;
Если НачалоСтрока = Неопределено Тогда
НачалоСтрока = 1 ;
Пока НЕ ТабДок. Область( НачалоСтрока, НачалоСтолбец) . СодержитЗначение
И НачалоСтрока < ТабДок. ВысотаТаблицы
Цикл
НачалоСтрока = НачалоСтрока + 1 ;
КонецЦикла ;
ИначеЕсли НачалоСтолбец = Неопределено Тогда
НачалоСтолбец = 1 ;
Пока НЕ ТабДок. Область( НачалоСтрока, НачалоСтолбец) . СодержитЗначение
И НачалоСтолбец < ТабДок. ШиринаТаблицы
Цикл
НачалоСтолбец = НачалоСтолбец + 1 ;
КонецЦикла ;
КонецЕсли ;
КонецСтрока = ? ( КонецСтрока = Неопределено , ТабДок. ВысотаТаблицы, КонецСтрока) ;
КонецСтолбец = ? ( КонецСтолбец = Неопределено , ТабДок. ШиринаТаблицы, КонецСтолбец) ;
ЭтоТаблица = ( ТипЗнч( СтруктураКолонок) = Тип( "ТаблицаЗначений" ) ) ;
ТабЗначений = ПолучитьТаблицуВывода( СтруктураКолонок) ;
Для ИндексСтроки = НачалоСтрока По КонецСтрока Цикл
СтрокаТЗ = ТабЗначений. Добавить( ) ;
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из СтруктураКолонок Цикл
НаименованиеКолонки = ? ( ЭтоТаблица, Колонка. Наименование, Колонка. Ключ) ;
пИндексКолонки = ? ( ЭтоТаблица, Колонка. СтолбецОтчёт, ИндексКолонки) ;
Если ТабДок. Область( ИндексСтроки, пИндексКолонки) . СодержитЗначение Тогда
СтрокаТЗ[НаименованиеКолонки] = ТабДок. Область( ИндексСтроки, пИндексКолонки) . Значение;
Иначе
СтрокаТЗ[НаименованиеКолонки] = ТабДок. Область( ИндексСтроки, пИндексКолонки) . Текст;
КонецЕсли ;
ИндексКолонки = ИндексКолонки + 1 ;
КонецЦикла ;
КонецЦикла ;
Возврат ТабЗначений;
КонецФункции ;
Функция ПреобразоватьТЗвТД(ТабЗначений, ТабДок = Неопределено, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, ВыводитьЗаголовки = Ложь) Экспорт
Если ТабДок = Неопределено Тогда
ТабДок = Новый ТабличныйДокумент;
КонецЕсли ;
НачалоСтрока = ? ( НачалоСтрока = Неопределено , 1 , НачалоСтрока) ;
НачалоСтолбец = ? ( НачалоСтолбец = Неопределено , 1 , НачалоСтолбец) ;
ИндексСтроки = НачалоСтрока;
Если ВыводитьЗаголовки Тогда
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений. Колонки Цикл
ТабДок. Область( ИндексСтроки, ИндексКолонки) . Текст = ? ( ПустаяСтрока( Колонка. Заголовок) , Колонка. Имя, Колонка. Заголовок) ;
ИндексКолонки = ИндексКолонки + 1 ;
КонецЦикла ;
ИндексСтроки = ИндексСтроки + 1 ;
КонецЕсли ;
Для Каждого Элемент Из ТабЗначений Цикл
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений. Колонки Цикл
ТабДок. Область( ИндексСтроки, ИндексКолонки) . СодержитЗначение = Истина ;
ТабДок. Область( ИндексСтроки, ИндексКолонки) . ТипЗначения = Новый ОписаниеТипов( Колонка. ТипЗначения) ;
ТабДок. Область( ИндексСтроки, ИндексКолонки) . Значение = Элемент[Колонка. Имя];
ИндексКолонки = ИндексКолонки + 1 ;
КонецЦикла ;
ИндексСтроки = ИндексСтроки + 1 ;
КонецЦикла ;
Возврат ТабДок;
КонецФункции ;
Функция ПрочитатьТЗИзMXL(ИмяФайла, СтруктураКолонок = Неопределено, ЕстьЗаголовок = Истина) Экспорт
ТабДок = Новый ТабличныйДокумент;
ТабДок. Прочитать( ИмяФайла) ;
Если СтруктураКолонок = Неопределено И ЕстьЗаголовок Тогда
СтруктураКолонок = Новый Структура;
Для ИндексКолонки = 1 По ТабДок. ШиринаТаблицы Цикл
Обл1 = ТабДок. Область( 1 , ИндексКолонки) ;
Обл2 = ТабДок. Область( 2 , ИндексКолонки) ;
ИмяКолонки = СокрЛП( Обл1 . Текст) ;
ИмяКолонки = ? ( Найти( ИмяКолонки, " " ) > 0 , СтрЗаменить( ТРег( ИмяКолонки) , " " , "" ) , ИмяКолонки) ;
СтруктураКолонок. Вставить( ИмяКолонки, ? ( Обл2 . СодержитЗначение, Обл2 . ТипЗначения, Новый ОписаниеТипов) ) ;
КонецЦикла ;
ИначеЕсли СтруктураКолонок = Неопределено И НЕ ЕстьЗаголовок Тогда
СтруктураКолонок = Новый Структура;
Для ИндексКолонки = 1 По ТабДок. ШиринаТаблицы Цикл
Обл2 = ТабДок. Область( 1 , ИндексКолонки) ;
ИмяКолонки = "К" + Формат( ИндексКолонки, "ЧДЦ=0; ЧН=0; ЧГ=0" ) ;
СтруктураКолонок. Вставить( ИмяКолонки, ? ( Обл2 . СодержитЗначение, Обл2 . ТипЗначения, Новый ОписаниеТипов) ) ;
КонецЦикла ;
КонецЕсли ;
Таблица = ПреобразоватьТДвТЗ( ТабДок, СтруктураКолонок, ? ( ЕстьЗаголовок, 2 , 1 ) , 1 ) ;
Возврат Таблица;
КонецФункции ;
Процедура ЗаписатьТЗВMXL(ИмяФайла, ТабЗначений, ЕстьЗаголовок = Истина) Экспорт
ТабДок = ПреобразоватьТЗвТД( ТабЗначений, Неопределено , 1 , 1 , ЕстьЗаголовок) ;
ТабДок. Записать( ИмяФайла, ТипФайлаТабличногоДокумента. MXL) ;
КонецПроцедуры ;
Еще небольшой набор функций для вывода таблицы значений в табличный документ. После формирования табличного документа, - сохраняем его в файл mxl.
Табличный документ можно сохранить a файлы следующих типов:
ANSITXT - Текстовый документ DOCX - документ MS Word HTML HTML3 HTML4 HTML5 MXL MXL7 ODS - Файл Open Office PDF - файл Acrobat Readr TXT - Текстовый документ XLS - файл Excel XLS95 - файл Excel95 XLS97 - файл Excel97 XLSX - файл Excel2010
Код 1C v 8.3
Функция ЗагрузитьТЗизФайла(ИмяФайла)
Путь = КаталогВременныхФайлов( ) + ИмяФайла;
Текст = Новый ЧтениеТекста( Путь, КодировкаТекста. UTF8) ;
стрТЗ = Текст. Прочитать( ) ;
Текст. Закрыть( ) ;
ТЗ = ЗначениеИзСтрокиВнутр( стрТЗ) ;
Возврат ТЗ;
КонецФункции
Функция ЗаписьТЗ2ТабДок(записьТЗ,НомерСтроки,ТабличныйДокумент)
НомерКолонки = 1 ;
Символ160 = Символ( 160 ) ;
Для каждого полеТЗ из ЗаписьТЗ цикл
типПоляТЗ = ТипЗнч( полеТЗ) ;
если типПоляТЗ = Тип( "Число" ) тогда
полеТЗ= Строка( полеТЗ) ;
полеТЗ= СтрЗаменить( полеТЗ, Символ160 , "" ) ;
полеТЗ= СтрЗаменить( полеТЗ, "," , "." ) ;
иначеесли типПоляТЗ = Тип( "Строка" ) тогда
иначе
полеТЗ = строка( полеТЗ) ;
КонецЕсли ;
имяОбласти = "R" + номерСтроки + "C" + НомерКолонки;
имяОбласти = СтрЗаменить( имяОбласти, Символ( 160 ) , "" ) ;
Ячейка = ТабличныйДокумент. Область( имяОбласти) ;
Ячейка. Текст = полеТЗ;
НомерКолонки = НомерКолонки + 1 ;
КонецЦикла ;
КонецФункции
Функция НаимКолонок2Mxl(ТаблицаЗначений,ТабличныйДокумент)
номерСтроки= 1 ;
номКолонки= 1 ;
ТабличныйДокумент = новый ТабличныйДокумент;
Для НомКол= 0 по ТаблицаЗначений. Колонки. Количество( ) - 1 Цикл
имяКолонки= ТаблицаЗначений. Колонки[НомКол]. Имя;
имяОбласти = "R" + номерСтроки + "C" + номКолонки;
имяОбласти = СтрЗаменить( имяОбласти, Символ( 160 ) , "" ) ;
Ячейка = ТабличныйДокумент. Область( имяОбласти) ;
Ячейка. Текст = имяКолонки;
ЖирныйШрифт = ? ( ЖирныйШрифт = Неопределено , Новый Шрифт( Ячейка. Шрифт, , , Истина ) , ЖирныйШрифт) ;
Ячейка. Шрифт = ЖирныйШрифт;
номКолонки = номКолонки + 1 ;
КонецЦикла ;
КонецФункции
Функция Таблица2Mxl(ТаблицаЗначений,ТабличныйДокумент)
НомСтр= 1 ;
Для каждого записьТЗ из ТаблицаЗначений Цикл
НомСтр = НомСтр + 1 ;
ЗаписьТЗ2 ТабДок( записьТЗ, НомСтр, ТабличныйДокумент) ;
КонецЦикла ;
КонецФункции
Функция ТаблицаЗначений2Mxl(ТаблицаЗначений,ФайлMxl)
ТабличныйДокумент = новый ТабличныйДокумент;
НаимКолонок2 Mxl( ТаблицаЗначений, ТабличныйДокумент) ;
Таблица2 Mxl( ТаблицаЗначений, ТабличныйДокумент) ;
ТабличныйДокумент. Записать( ФайлMxl, ТипФайлаТабличногоДокумента. MXL) ;
ТабличныйДокумент. Показать( ФайлMxl, ФайлMxl) ;
Возврат 0 ;
КонецФункции
Функция Тест_ВыгрузитьТЗвMxl() ;
файл_мТЗИсходныеДанные = "мТЗИсходныеДанные.dat" ;
ТЗ = ЗагрузитьТЗизФайла( файл_мТЗИсходныеДанные) ;
ФайлMxl = КаталогВременныхФайлов( ) + СтрЗаменить( файл_мТЗИсходныеДанные, ".dat" , ".mxl" ) ;
ТаблицаЗначений2 Mxl( ТЗ, ФайлMxl) ;
КонецФункции
Тест_ВыгрузитьТЗвMxl( ) ;
Пример выгруженной таблицы значений в файл:
Категория:
Работа с Таблицей Значений Функция разбора (разложения) строки в массив, аналог СтрРазделить Код 1C v 8.х Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = "," ,
Знач ПропускатьПустыеСтроки = Неопределено)
Результат = Новый Массив;
Если ПропускатьПустыеСтроки = Неопределено Тогда
ПропускатьПустыеСтроки = ? ( Разделитель = " " , Истина , Ложь ) ;
Если ПустаяСтрока( Строка) Тогда
Если Разделитель = " " Тогда
Результат. Добавить( "" ) ;
КонецЕсли ;
Возврат Результат;
КонецЕсли ;
КонецЕсли ;
Позиция = Найти( Строка, Разделитель) ;
Пока Позиция > 0 Цикл
Подстрока = Лев( Строка, Позиция - 1 ) ;
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока( Подстрока) Тогда
Результат. Добавить( Подстрока) ;
КонецЕсли ;
Строка = Сред( Строка, Позиция + СтрДлина( Разделитель) ) ;
Позиция = Найти( Строка, Разделитель) ;
КонецЦикла ;
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока( Строка) Тогда
Результат. Добавить( Строка) ;
КонецЕсли ;
Возврат Результат;
КонецФункции
Источник
зы: админ, вот искал аналог СтрРазделить с игнорированием пустых строк - не нашел,зато нашел много дублей: https://helpf.pro/faq/view/504.html https://helpf.pro/faq/view/171.html https://helpf.pro/faq/view/351.html
, объедини пожалуйста.
зыы: кнопкой вставки ссылки невозможно пользоваться, ну что за извращенство с подменю, сделай одинарной как везде.
Категория:
Работа с Текстом (Строкой) ДеревоЗначений в ТекстовыйДокумент Код 1C v 8.2 УП
&НаСервереБезКонтекста
Процедура ВывестиДеревоЗначенийВТекст(Знач рВетка,рТекст,Знач рПараметры=Неопределено)
Попытка
Если рТекст= Неопределено Тогда
Если ТипЗнч( рВетка) < > Тип( "ДеревоЗначений" ) Тогда Возврат КонецЕсли ;
Если ТипЗнч( рПараметры) < > Тип( "Структура" ) Тогда рПараметры= Новый Структура КонецЕсли ;
стрКолонок= ? ( рПараметры. Свойство( "Колонки" ) , рПараметры. Колонки, Неопределено ) ;
Если ТипЗнч( стрКолонок) < > Тип( "Структура" ) Тогда стрКолонок= Новый Структура КонецЕсли ;
рПоказыватьУровни= ? ( рПараметры. Свойство( "ПоказыватьУровни" ) , рПараметры. ПоказыватьУровни, Ложь ) ;
рШагОтступа= ? ( рПараметры. Свойство( "ШагОтступа" ) , рПараметры. ШагОтступа, 2 ) ;
рДеревоДляТеста= рВетка;
рЗапись= Новый ЗаписьXML;
рЗапись. УстановитьСтроку( ) ;
СериализаторXDTO. ЗаписатьXML( рЗапись, рДеревоДляТеста) ;
стро= рЗапись. Закрыть( ) ;
стро= СтрЗаменить( стро, "xmlns=" , "xmlns:myns1C=" ) ;
рЧтение= Новый ЧтениеXML;
рЧтение. УстановитьСтроку( стро) ;
постр= Новый ПостроительDOM;
рДокументДОМ= постр. Прочитать( рЧтение) ;
рВыражение= "/ValueTree/row" ; максКолвоУровней= 1 ;
рРазыменователь= Новый РазыменовательПространствИменDOM( рДокументДОМ) ;
Пока Истина Цикл
#Если Клиент Тогда
ОбработкаПрерыванияПользователя( ) ;
#КонецЕсли
рРезультат= рДокументДОМ. ВычислитьВыражениеXPath( рВыражение, рДокументДОМ, рРазыменователь, ТипРезультатаDOMXPath. Любой) ;
Если рРезультат. ПолучитьСледующий( ) = Неопределено Тогда Прервать КонецЕсли ;
рВыражение= рВыражение+ "/row" ;
максКолвоУровней= максКолвоУровней+ 1 ;
КонецЦикла ;
максКолвоУровней= максКолвоУровней- 1 ;
строПробелы= " " ;
строРазделители= "===============================================================================================" ;
строОтступы= "___________________________________________________________________________________________" ;
секШапка1 = "|[_HCS" + Лев( строПробелы, максКолвоУровней* рШагОтступа) + "]|" ;
секГорРазделитель1 = "|" + Лев( строОтступы, максКолвоУровней* рШагОтступа+ 6 ) + "|" ;
рШиринаКолонкиИерархии= СтрДлина( секШапка1 ) - 2 ;
строПолейШапки= "#Поле _HCS
| #Выравнивание Центр" ;
строПолейЗаписи= "" ;
Если рПоказыватьУровни Тогда
секШапка1 = секШапка1 + "[_Level]|" ;
секГорРазделитель1 = секГорРазделитель1 + Лев( строРазделители, 8 ) + "|" ;
строПолейШапки= строПолейШапки+ "
|#Поле _Level
| #Выравнивание Центр" ;
строПолейЗаписи= "#Поле _Level
| #Выравнивание Центр
| #Забивать Истина" ;
КонецЕсли ;
мИменКолонок= Новый Массив;
Для каждого кол Из рВетка. Колонки Цикл
Если стрКолонок. Количество( ) < > 0 и не стрКолонок. Свойство( кол. Имя) Тогда Продолжить КонецЕсли ;
рДлинаИмениКолонки= СтрДлина( кол. Имя) ;
рНужнаяШирина= Макс( ? ( кол. Ширина< 3 , 10 , кол. Ширина) , рДлинаИмениКолонки) ;
секШапка1 = секШапка1 + "[" + кол. Имя+ Лев( строПробелы, рНужнаяШирина- рДлинаИмениКолонки) + "]|" ;
секГорРазделитель1 = секГорРазделитель1 + Лев( строРазделители, рНужнаяШирина+ 1 ) + "=|" ;
строПолейШапки= строПолейШапки+ "
|#Поле " + кол. Имя+ "
| #Выравнивание Центр" ;
рОписТипов= кол. ТипЗначения;
Если рОписТипов. Типы( ) . Количество( ) = 1 и рОписТипов. СодержитТип( Тип( "Булево" ) ) Тогда
рВыравнивание= "Центр" ;
ИначеЕсли рОписТипов. СодержитТип( Тип( "Число" ) ) Тогда
рВыравнивание= "Право" ;
ИначеЕсли рОписТипов. СодержитТип( Тип( "Строка" ) ) и рОписТипов. КвалификаторыСтроки. Длина= 0 Тогда
рВыравнивание= "ПоШирине" ;
Иначе
рВыравнивание= "Лево" ;
КонецЕсли ;
строПолейЗаписи= строПолейЗаписи+ ? ( ПустаяСтрока( строПолейЗаписи) , "" , Символы. ПС) + "#Поле " + кол. Имя+ "
| #Выравнивание " + рВыравнивание;
Попытка
Если ЗначениеЗаполнено( стрКолонок[кол. Имя]) Тогда
строПолейЗаписи= строПолейЗаписи+ "
| #Формат "" " + СокрЛП( стрКолонок[кол. Имя]) + """ " ;
КонецЕсли ;
Исключение
КонецПопытки ;
мИменКолонок. Добавить( кол. Имя) ;
КонецЦикла ;
секШапка2 = СтрЗаменить( СтрЗаменить( секШапка1 , "[" , "<" ) , "]" , ">" ) ;
секЗапись1 = секШапка1 ; секЗапись2 = секШапка2 ;
секГорРазделитель2 = СтрЗаменить( СтрЗаменить( секГорРазделитель1 , "=" , "-" ) , "|" , "+" ) ;
секГорРазделитель1 = СтрЗаменить( секГорРазделитель1 , "_" , "=" ) ;
секГорРазделитель2 = СтрЗаменить( секГорРазделитель2 , "_" , " " ) ;
тМакет= Новый ТекстовыйДокумент;
тМакет. ДобавитьСтроку( "#Область Шапка" ) ;
тМакет. ДобавитьСтроку( строПолейШапки) ;
тМакет. ДобавитьСтроку( секГорРазделитель1 ) ;
тМакет. ДобавитьСтроку( секШапка1 ) ;
тМакет. ДобавитьСтроку( секШапка2 ) ;
тМакет. ДобавитьСтроку( секГорРазделитель1 ) ;
тМакет. ДобавитьСтроку( "#КонецОбласти" ) ;
тМакет. ДобавитьСтроку( "" ) ;
тМакет. ДобавитьСтроку( "#Область Запись" ) ;
тМакет. ДобавитьСтроку( строПолейЗаписи) ;
тМакет. ДобавитьСтроку( секЗапись1 ) ;
тМакет. ДобавитьСтроку( секЗапись2 ) ;
тМакет. ДобавитьСтроку( секГорРазделитель2 ) ;
тМакет. ДобавитьСтроку( "#КонецОбласти" ) ;
рПараметры. Вставить( "ИсходныйМакет" , тМакет) ;
рТекст= Новый ТекстовыйДокумент;
сек= тМакет. ПолучитьОбласть( "Шапка" ) ;
сек. Параметры. _HCS= "Иерархия" ;
Для каждого имякол Из мИменКолонок Цикл
кол= рВетка. Колонки[имякол];
сек. Параметры[кол. Имя]= ? ( ПустаяСтрока( кол. Заголовок) , кол. Имя, кол. Заголовок) ;
КонецЦикла ;
рТекст. Вывести( сек) ;
пар= Новый Структура;
пар. Вставить( "МассивИмёнКолонок" , мИменКолонок) ;
пар. Вставить( "ТекущаяСекция" , тМакет. ПолучитьОбласть( "Запись" ) ) ;
пар. Вставить( "ШиринаКолонкиИерархии" , рШиринаКолонкиИерархии) ;
пар. Вставить( "ПоказыватьУровни" , рПоказыватьУровни) ;
пар. Вставить( "Отступ" , 0 ) ;
пар. Вставить( "ШагОтступа" , рШагОтступа) ;
ВывестиДеревоЗначенийВТекст( рВетка, рТекст, пар) ;
Иначе
мИменКолонок= рПараметры. МассивИмёнКолонок;
рСекция= рПараметры. ТекущаяСекция;
рОтступ= рПараметры. Отступ;
рШиринаКолонкиИерархии= рПараметры. ШиринаКолонкиИерархии;
рПоказыватьУровни= рПараметры. ПоказыватьУровни;
строОтступы= "_________________________________________________________________________________________________________" ;
строПробелы= " " ;
пар= Новый Структура;
пар. Вставить( "МассивИмёнКолонок" , мИменКолонок) ;
пар. Вставить( "ТекущаяСекция" , рПараметры. ТекущаяСекция) ;
пар. Вставить( "ШиринаКолонкиИерархии" , рШиринаКолонкиИерархии) ;
пар. Вставить( "ПоказыватьУровни" , рПоказыватьУровни) ;
пар. Вставить( "ШагОтступа" , рПараметры. ШагОтступа) ;
пар. Вставить( "Отступ" , рОтступ+ рПараметры. ШагОтступа) ;
Для каждого рПодветка Из рВетка. Строки Цикл
рСекция. Параметры. _HCS= Лев( строПробелы, рОтступ) + "\" + Лев( строОтступы, рШиринаКолонкиИерархии- рОтступ- 1 ) ;
Если рПоказыватьУровни Тогда
рСекция. Параметры. _Level= рПодветка. Уровень( ) ;
КонецЕсли ;
Для каждого имякол Из мИменКолонок Цикл
рСекция. Параметры[имякол]= рПодветка[имякол];
КонецЦикла ;
рТекст. Вывести( рСекция) ;
ВывестиДеревоЗначенийВТекст( рПодветка, рТекст, пар)
КонецЦикла ;
КонецЕсли ;
Исключение
Сообщить( "ВывестиДеревоЗначенийВТекст, ошибка: " + ОписаниеОшибки( ) , СтатусСообщения. ОченьВажное) ;
КонецПопытки ;
КонецПроцедуры
Источник
Категория:
Работа с Деревом Значений Динамический отчет на СКД с разными вариантами На днях делал несколько однотипных отчетов на СКД.
Общий принцип: формируются все варианты отчета, указанные в настройках схемы и каждый вариант выводится на отдельной вкладке.
Потом возникла мысль попробовать объединить все схемы в один отчет, чтобы не плодить лишних объектов в конфигурации. При этом количество вариантов в этих схемах заранее неизвестно. Ok, challenge accepted.
В тестовой конфигурации создаю для отчета две схемы компоновки, "Склад" и "Заявки".
Запросы наборов данных приводить не буду, для каждой схемы в настройках добавляю несколько вариантов отчетов.
Теперь переходим к созданию формы. Практически все реквизиты формы будут создаваться при выборе необходимого макета отчета.
Код 1C v 8.2 УП &НаСервере
Процедура СоздатьПереченьОтчетов()
Для Каждого Макет Из РеквизитФормыВЗначение( "Отчет" ) . Метаданные( ) . Макеты Цикл
Элементы. МакетОтчета. СписокВыбора. Добавить( Макет. Имя, Макет. Синоним) ;
КонецЦикла ;
КонецПроцедуры
&НаСервере
Процедура ОбработатьВыборМакета()
Макет = РеквизитФормыВЗначение( "Отчет" ) . ПолучитьМакет( МакетОтчета) ;
мУдалить = ? ( ПустаяСтрока( РеквизитыКУдалению) , Новый Массив, ПолучитьИзВременногоХранилища( РеквизитыКУдалению) ) ;
мДобавить = Новый Массив;
кУдалению = Новый Массив;
Для Каждого Вариант Из Макет. ВариантыНастроек Цикл
ИмяРеквизита = "ТабДок_" + Вариант. Имя;
тРеквизит = Новый РеквизитФормы( ИмяРеквизита, Новый ОписаниеТипов( "ТабличныйДокумент" ) ) ;
мДобавить. Добавить( тРеквизит) ;
кУдалению. Добавить( ИмяРеквизита) ;
КонецЦикла ;
ИзменитьРеквизиты( мДобавить, мУдалить) ;
Пока Элементы. СтраницыОтчета. ПодчиненныеЭлементы. Количество( ) Цикл
Элементы. Удалить( Элементы. СтраницыОтчета. ПодчиненныеЭлементы[0 ]) ;
КонецЦикла ;
Для Каждого Вариант Из Макет. ВариантыНастроек Цикл
Страница = Элементы. Добавить( "Страница_" + Вариант. Имя, Тип( "ГруппаФормы" ) , Элементы. СтраницыОтчета) ;
Страница. Вид = ВидГруппыФормы. Страница;
Страница. Заголовок = Вариант. Представление;
ИмяРеквизита = "ТабДок_" + Вариант. Имя;
ТабДок = Элементы. Добавить( ИмяРеквизита, Тип( "ПолеФормы" ) , Страница) ;
ТабДок. Вид = ВидПоляФормы. ПолеТабличногоДокумента;
ТабДок. ПутьКДанным = ИмяРеквизита;
ТабДок. ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы. Нет;
ЭтаФорма[ИмяРеквизита]. Очистить( ) ;
КонецЦикла ;
РеквизитыКУдалению = ПоместитьВоВременноеХранилище( кУдалению, УникальныйИдентификатор) ;
КонецПроцедуры
&НаСервере
Процедура СформироватьОтчеты()
Схема = РеквизитФормыВЗначение( "Отчет" ) . ПолучитьМакет( МакетОтчета) ;
Для Каждого Вариант Из Схема. ВариантыНастроек Цикл
Отчет. КомпоновщикНастроек. ЗагрузитьНастройки( Вариант. Настройки) ;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета. Выполнить( Схема, Отчет. КомпоновщикНастроек. ПолучитьНастройки( ) ) ;
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки. Инициализировать( Макет) ;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода. УстановитьДокумент( ЭтаФорма["ТабДок_" + Вариант. Имя]) ;
ПроцессорВывода. Вывести( ПроцессорКомпоновки) ;
КонецЦикла ;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СоздатьПереченьОтчетов( ) ;
КонецПроцедуры
&НаКлиенте
Процедура МакетОтчетаПриИзменении(Элемент)
ОбработатьВыборМакета( ) ;
КонецПроцедуры
&НаКлиенте
Процедура Сформировать(Команда)
СформироватьОтчеты( ) ;
КонецПроцедуры
Смотрим, что получилось.
Выгрузка базы 1Cv8skd.rar
Источник
Категория:
Схема Компоновки Данных Как убрать лидирующие нули в номере Документа Часто при разработке печатных форм или отчетов, нужно номера документов вида 000001 преобразовать в 1 - убрав лидирующие нули. в этой статье я приведу несколько способов, а какой выбрать - решайте сами:
Код 1C v 8.х Функция УбратьЛидирующиеНули(НомерДокумента)
Пока Найти( НомерДокумента, "0" ) > 0 Цикл
УбратьЛидирующиеНули( Прав( НомерДокумента, СтрДлина( НомерДокумента) - 1 ) ) ;
КонецЦикла ;
Возврат НомерДокумента;
КонецФункции
Код 1C v 8.х Функция УбратьЛидирующиеНули(НомерДокумента)
Попытка
НомерДокумента = Формат( Число( НомерДокумента) , "ЧГ=" ) ;
Исключение
НомерДокумента = СтрЗаменить( СокрЛ( СтрЗаменить( СокрП( НомерДокумента) , "0" , " " ) ) , " " , "0" ) ;
Префикс = "" ;
Пока КодСимвола( НомерДокумента) < 48 Или КодСимвола( НомерДокумента) > 57 Цикл
Префикс = Префикс + Лев( НомерДокумента, 1 ) ;
НомерДокумента = Сред( НомерДокумента, 2 ) ;
КонецЦикла ;
Если Не ПустаяСтрока( Префикс) Тогда
НомерДокумента = Префикс + УбратьЛидирующиеНули( НомерДокумента) ;
КонецЕсли ;
КонецПопытки ;
Возврат НомерДокумента;
КонецФункции
В запросе:
Код 1C v 8.х ВЫБРАТЬ
ВЫБОР
КОГДА Не ПОДСТРОКА( &Номер, 1, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 1, 10)
КОГДА Не ПОДСТРОКА( &Номер, 2, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 2, 9)
КОГДА Не ПОДСТРОКА( &Номер, 3, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 3, 8)
КОГДА Не ПОДСТРОКА( &Номер, 4, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 4, 7)
КОГДА Не ПОДСТРОКА( &Номер, 5, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 5, 6)
КОГДА Не ПОДСТРОКА( &Номер, 6, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 6, 5)
КОГДА Не ПОДСТРОКА( &Номер, 7, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 7, 4)
КОГДА Не ПОДСТРОКА( &Номер, 8, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 8, 3)
КОГДА Не ПОДСТРОКА( &Номер, 9, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 9, 2)
Иначе ПОДСТРОКА( &Номер, 10, 1)
КОНЕЦ КАК НомерБезНулей
Простые примеры:
Код 1C v 8.х Пока Лев( Номер, 1 ) = "0" Цикл
Номер = Прав( Номер, СтрДлина( Номер) - 1 ) ;
КонецЦикла ;
Код 1C v 8.х
Функция УбратьНули(НомерСтрокой)
Если Лев( НомерСтрокой, 1 ) = "0" Тогда
Возврат УбратьНули( Прав( НомерСтрокой, СтрДлина( НомерСтрокой) - 1 ) ) ;
Иначе
Возврат НомерСтрокой;
КонецЕсли ;
КонецФункции
ИтоговаяСтрока = УбратьНули( Номер) ;
Категория:
Работа с Текстом (Строкой) Загрузка данных в документ из табличного документа (в ТД скопировано из Excel) Частенько пользователи просят упростить ввод данных в программу используя копирование таблиц из Excel. Ниже я приведу пример как загрузить данные скопированные из Excel:
Создаем форму для загрузки данных:
внутри пишем код:
Код 1C v 8.х
ТаблицаДанных = Новый ТаблицаЗначений;
НомерКолонки = 0 ;
Пока Истина Цикл
НомерКолонки = НомерКолонки + 1 ;
ИмяКолонки = ТабДок. Область( 1 , НомерКолонки) . Текст;
Если ПустаяСтрока( ИмяКолонки) Тогда
Прервать ;
КонецЕсли ;
ТаблицаДанных. Колонки. Добавить( "К" + Строка( НомерКолонки) ) ;
КонецЦикла ;
СчетчикКолонок = НомерКолонки - 1 ;
НомерСтроки = 1 ; ФлагПрерывания = Ложь ;
Пока Истина Цикл
НомерСтроки = НомерСтроки + 1 ;
Стр = ТаблицаДанных. Добавить( ) ;
Для А = 1 ПО СчетчикКолонок Цикл
ТекстКолонки = ТабДок. Область( НомерСтроки, А) . Текст;
Если ПустаяСтрока( ТекстКолонки) Тогда
Если А = КолонкаИндекса Тогда
Флагпрерывания = Истина ;
ТаблицаДанных. Удалить( Стр) ;
КонецЕсли ;
Иначе
Стр[А - 1 ] = ТекстКолонки
КонецЕсли ;
Если Флагпрерывания Тогда
Прервать
КонецЕсли ;
КонецЦикла ;
Если Флагпрерывания Тогда
Прервать
КонецЕсли ;
КонецЦикла ;
Возврат ТаблицаДанных
КонецФункции
Процедура ОсновныеДействияФормыЗагрузить(Кнопка)
тзДанных= ПолучитьТЗИзМакета( ЭлементыФормы. ПолеТД) ;
Закрыть( тзДанных) ;
КонецПроцедуры
В документ добавлена кнопка - Загрузка из Excel ее код:
Код 1C v 8.х
Функция РазобратьДату(ИзмДата) ;
Возврат Дата( Сред( ИзмДата, 7 , 4 ) + Сред( ИзмДата, 4 , 2 ) + Сред( ИзмДата, 0 , 2 ) ) ;
КонецФункции
Процедура ЗагрузитьИзЕкселНажатие(Элемент)
тзДанных = ПолучитьФорму( "ФормаЗагрузкиИзExcel" ) . ОткрытьМодально( ) ;
ГрафикПлатежейКлиент. Очистить( ) ;
Для Каждого стр из тзДанных Цикл
нСтр = ГрафикПлатежейКлиент. Добавить( ) ;
нСтр. Дата = РазобратьДату( стр. К1 ) ;
нСтр. Сумма = стр. К2 ;
нСтр. СуммаАкта = стр. К3 ;
КонецЦикла ;
КонецПроцедуры
Смысл в том что из Excel копируют таблицу:
Жмут на кнопку загрузить и в документе Табличная часть заполняется автоматически:
Категория:
Табличный документ Выгрузка картинок из базы 1С в XML В нынешнее время для электронного каталога или интернет-магазина необходимо выгружать не только информацию о цене и характеристиках товара, но и сопутствующие изображения. Хранящиеся в базе или связанные с номенклатурой изображения порой приходилось выгружать отдельно, подвергая предварительной обработке имена файлов, подгоняя их под правила связи товара с изображениями в приемнике. Тем не менее, в 1С существует возможность поместить двоичные данные изображений в виде строки в XML, либо другой файл выгрузки, чтобы уже на месте разобрать информацию о товаре.
Рассмотрим на примере следующей конфигурации.
Перечень объектов:
- справочники "Номенклатура", подчиненный ему справочник "Файлы";
- документ "Установка цен";
- обработка "Выгрузка прайса";
- перечисления "Типы файлов", "Типы номенклатуры";
- регистр "Цены номенклатуры".
Для начала, добавим форму элемента для справочника "Файлы"
Код 1C v 8.2 УП &НаСервере
Процедура ОбновитьКартинкуФорма(ХранилищеКартинки)
Если Объект. ТипФайла = Перечисления. ТипыФайлов. Картинка Тогда
Картинка = ПоместитьВоВременноеХранилище( ХранилищеКартинки. Получить( ) , УникальныйИдентификатор) ;
КонецЕсли ;
КонецПроцедуры
&НаСервере
Процедура ПоместитьНаСервер(Данные = Неопределено)
ХранилищеКартинки = ? ( Данные = Неопределено , Неопределено , Новый ХранилищеЗначения( Данные) ) ;
ОбновитьКартинкуФорма( ХранилищеКартинки) ;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьФайл(Команда)
Режим = РежимДиалогаВыбораФайла. Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытияФайла. ПолноеИмяФайла = "" ;
ДиалогОткрытияФайла. Фильтр = "Все *.*|*.*|.jpg|*.jpg|.png|*.png" ;
ДиалогОткрытияФайла. МножественныйВыбор = Ложь ;
ДиалогОткрытияФайла. Заголовок = "Выберите файл" ;
Если ДиалогОткрытияФайла. Выбрать( ) Тогда
мФайл = ДиалогОткрытияФайла. ПолноеИмяФайла;
ПоместитьНаСервер( Новый ДвоичныеДанные( мФайл) ) ;
Иначе
Текст = "Файл не выбран!" ;
Предупреждение( Текст) ;
КонецЕсли ;
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
ОбновитьКартинкуФорма( ТекущийОбъект. ХранилищеФайла) ;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
ТекущийОбъект. ХранилищеФайла = ? ( ПустаяСтрока( Картинка) , Неопределено , Новый ХранилищеЗначения( ПолучитьИзВременногоХранилища( Картинка) ) ) ;
КонецПроцедуры
Настроим форму документа "Установка цен".
Код 1C v 8.2 УП &НаСервере
Процедура ЗаполнитьТЧ()
Результат = ВыгрузкаПрайса. ПолучитьТаблицуЦен( Объект. Дата) ;
Объект. Товары. Загрузить( Результат) ;
КонецПроцедуры
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьТЧ( ) ;
КонецПроцедуры
Добавляем обработку выгрузки в XML.
Код 1C v 8.2 УП &НаКлиенте
Процедура Выгрузить(Команда)
Если ПустаяСтрока( ФайлВыгрузки) Тогда
Возврат ;
КонецЕсли ;
мСтрока = ВыгрузкаПрайса. ПолучитьДанныеXML( ) ;
мФайл = Новый ТекстовыйДокумент;
мФайл. УстановитьТекст( мСтрока) ;
мФайл. Записать( ФайлВыгрузки) ;
КонецПроцедуры
&НаКлиенте
Процедура ФайлВыгрузкиОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
Режим = РежимДиалогаВыбораФайла. Сохранение;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытияФайла. ПолноеИмяФайла = ФайлВыгрузки;
Фильтр = "(*.xml)|*.xml" ;
ДиалогОткрытияФайла. Фильтр = Фильтр;
ДиалогОткрытияФайла. Заголовок = "Выберите файл" ;
Если ДиалогОткрытияФайла. Выбрать( ) Тогда
ФайлВыгрузки = ДиалогОткрытияФайла. ПолноеИмяФайла;
Иначе
Текст = "ru = "" Файл(ы) не выбран!"" ; en = "" File(s) not selected!"" " ;
Предупреждение( НСтр( Текст) ) ;
КонецЕсли ;
КонецПроцедуры
При заполнении табличной части "Товары" документа "Установка цен" и в обработке выгрузки мы обращаемся к общему модулю "Выгрузка прайса":
Код 1C v 8.2 УП Функция ПолучитьТаблицуЦен(ДатаЗапроса = Неопределено) Экспорт
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Номенклатура,
| ЕСТЬNULL(Цены.Цена, 0) КАК Цена,
| ПРЕДСТАВЛЕНИЕ(Номенклатура.Ссылка) КАК НоменклатураСтрока
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Товар,
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
| ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ) КАК ЦеныНоменклатурыСрезПоследних) КАК Цены
| ПО Номенклатура.Ссылка = Цены.Товар
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура
|АВТОУПОРЯДОЧИВАНИЕ" ;
Запрос. УстановитьПараметр( "Дата" , ? ( ЗначениеЗаполнено( ДатаЗапроса) , ДатаЗапроса, ТекущаяДата( ) ) ) ;
Возврат Запрос. Выполнить( ) . Выгрузить( ) ;
КонецФункции
Функция ПолучитьИзображения(НоменклатураСсылка)
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| Файлы.Ссылка
|ИЗ
| Справочник.Файлы КАК Файлы
|ГДЕ
| Файлы.Владелец = &Владелец
| И Файлы.ТипФайла = ЗНАЧЕНИЕ(Перечисление.ТипыФайлов.Картинка)
| И НЕ Файлы.ПометкаУдаления" ;
Запрос. УстановитьПараметр( "Владелец" , НоменклатураСсылка) ;
Возврат Запрос. Выполнить( ) . Выгрузить( ) ;
КонецФункции
Функция ПолучитьДанныеXML() Экспорт
ТЧ_Цены = ПолучитьТаблицуЦен( ) ;
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML. УстановитьСтроку( ) ;
ЗаписьXML. ЗаписатьОбъявлениеXML( ) ;
ЗаписьXML. ЗаписатьНачалоЭлемента( "price_list" ) ;
Для Каждого СтрокаЦен Из ТЧ_Цены Цикл
ЗаписьXML. ЗаписатьНачалоЭлемента( "tovar" ) ;
ЗаписьXML. ЗаписатьАтрибут( "name" , СтрокаЦен. НоменклатураСтрока) ;
ЗаписьXML. ЗаписатьАтрибут( "price" , Формат( СтрокаЦен. Цена, "ЧРД=.; ЧГ=0" ) ) ;
ТЧ = ПолучитьИзображения( СтрокаЦен. Номенклатура) ;
Если НЕ ТЧ. Количество( ) = 0 Тогда
ЗаписьXML. ЗаписатьНачалоЭлемента( "picture_list" ) ;
Для Каждого СтрТЧ Из ТЧ Цикл
мДанные = СтрТЧ. Ссылка. ХранилищеФайла. Получить( ) ;
Если НЕ ЗначениеЗаполнено( мДанные) Тогда
Продолжить;
КонецЕсли ;
ЗаписьXML. ЗаписатьНачалоЭлемента( "picture" ) ;
ЗаписьXML. ЗаписатьАтрибут( "binary" , Base64Строка( мДанные) ) ;
ЗаписьXML. ЗаписатьКонецЭлемента( ) ;
КонецЦикла ;
ЗаписьXML. ЗаписатьКонецЭлемента( ) ;
КонецЕсли ;
ЗаписьXML. ЗаписатьКонецЭлемента( ) ;
КонецЦикла ;
ЗаписьXML. ЗаписатьКонецЭлемента( ) ;
СтрокаXML = ЗаписьXML. Закрыть( ) ;
Возврат СтрокаXML;
КонецФункции
Кодирование изображений выполняется с помощью функции Base64Строка , в качестве аргумента передаются двоичные данные из справочника "Файлы". Предполагается, что приемник XML может выполнить обратное преобразование. В 1С это можно сделать с помощью функции Base64Значение.
результат выгрузки прайса в XML:
Код Batch File (DOS, CMD, BAT) <?xml version="1 .0 "?>
<price_list>
<tovar name="Товар 1 " price="5 ">
<picture_list>
<picture binary="iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAB3RJTUUH3QINBSMt
F2PHEwAAABd0RVh0U29mdHdhcmUAR0xEUE5HIHZlciAzLjRxhaThAAAACHRwTkdH
TEQzAAAAAEqAKR8AAAAEZ0FNQQAAsY8L/GEFAAAABmJLR0QA/wD/AP+gvaeTAAAA
pklEQVR4nGP4jw3kajICEVYpBmRFcMafGkMgQhZB1wBRBDEYohquBy6F0AAXejM5
DoiQbUAWgehB2ACRg0jDEbIgRCUTAyponLY4XF8cjoBcNAUMaB44EiEBRJhsuJOY
8 rSY+oMNgDohJBCsvPiyZd0xIAIyICJwBUDF6E4iDEh1EnoowdXBVaOFElnBCvE3
cggCufAwgIQ1xMdQP5CcNMhJfMQnbwDR3npihwr9YwAAAABJRU5ErkJggg=="/>
</picture_list>
</tovar>
<tovar name="Товар 2 " price="10 "/>
<tovar name="Товар 3 " price="15 "/>
<tovar name="Товар 4 " price="18 ">
<picture_list>
<picture binary="iVBORw0KGgoAAAANSUhEUgAAAGUAAAAaCAYAAACuCJLbAAAABHNCSVQICAgIfAhk
iAAAAAlwSFlzAAADtgAAA7YBp8dLNgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3Nj
YXBlLm9yZ5vuPBoAABQvSURBVGiB7Xp5cJ3HceevZ77rXXjv4QZIAjzFUxIpSqQo
0 ZIiS5apK1EiKYpke2OvdawrLttyNrXeql2K3qxd8WZXKW9i+YiPjeNLdJxDt2Qd
DGVCMi+JJ0iQBEFcxPXu975zpvcPABQIgtRWHFftbrmrpoBvpmemp3/TPT09j5gZ
lyai7dvvEzhyRMaGHCObduT4aFUi+z7dfkNAHmhsTqh80VNuuxdh1Sp13/3 bNd5H
6 XSx9m3bSKwubbIblWtr2Pa4GyWgrRRLEYcQZkha/FoW8v8RmSw0tA4Ng6tCB2XD
krUU+T4yGe+mrW/4 wNzKnxOUvY9ebU4kzFTgO9mC9luIZDJSlAoVMoo5BcEmmOjX
vqr/x0kS60hT5AguWVIUmLlCUlViljmaEEGuoRqW139jTzi73/mgENG3HlkfW2Q5
mVxI7R7k4mqkFmjFVhRpN1RBVYdUYRGFWuk5URaE9/OHlyQCnesviH6lsS5Fmvnc
pmLwr7TBNGPO/oYUxNowTZOThrQShkGOIApituhPSt2rlR7O6yD/8 Df3ujNd2nmg
vPKxtYkoHW/I+VgakLGk5kdZ3/cLbqTznq8qtSCoeF5Qq0UcqrD2f6wwIc4Haqay
5 SUULwRY/oogz0WKQVrPrcjJ9vdAmgkeAFyq32ySZpxsASsRt2Mpy0o6tkjaplVv
2 WY6LmXeMPWpxoTumRitTXzkb96pTvc7B8r2bWusbC3TOFI2V9TccE01Cslzw+GJ
anloPOeWJoqeNxaFqhaR9n2fCWBvlhB0EQXOdnSSSAMATYG1eH7aPDVQDIFfr3Vc
jGYrHgB4SvmK+byz82JHNM+yFgcAA2TbNsUNFg3SNJoyjt2USWaymWR70jLb4rbB
MYcPJql2dF4gxqZdmQEA2EYiXfxQckxV5gWRWlJRISq1sG94LN9/bKxSGixUwrIP
7 Xkeu5hUJLlzAnC+RQBqDoZzPI8+vCG97+1 B9/ab18TTWds6eHyw/PVv7i1NtxPA
BGgAuObyFnP3wZEL/O8Pv3ffwse/8 OKZs8NlPbe65hRSMObe8XPV0xx1GpAXss0a
KwYCPMQAchwnTJWqflvR85aHuragIRYwxxaSNJdaMl6aSCgP26iArawNAHh2aL0T
xrz6IJALa75Oh27UNzyW739nOJ/vm/CjvOdp9z0QZoMx83s2CAwAf/lnt7f/1 dd2
j95597L45g0dTZWyChYvysxb2JG+0 iBKgCCY4W/YtOCd5Ss6DvWfLXlf/MqrJQD4
93 +0 IVlnJ+RYoRj85y/etmTBvPRy0zJTzNB//pdv/NP8jobs337ngfSGLd/aN5eS
L6K42QDOBdD7KX22HmbyT/JO6cwFCK6HWAy65EN7UaiAFnTWC0uastMwzEVOTOW6
ipvcTYBL/MQT4uXii5l81ViZ19hYqXmlkdFC976Bwkj3SMUv5D1Vu1CI6f/1 RerP
fX/zK3e33XbLkttjlkxCEPcNFnaM52rFtpa6lrbmxAZJwgamXRxzuRodE0I4/QP5
d1pakwuSjtXsxIz5AMBEipglALDmIIr4NBmoM4Ronhjzdi7Z9Bc730fRACAu0T67
bua3mPV9KV66yDwUAyibdcSKlqS9rjPdOr++fqUds1NZS3WlMvLoHc4tRXr6idWW
Xcs0lvN0JWfmb0q2LyyETvpMzWeMvbvrI5hSdGbpFdtj8xaPAIBpGFpIiZG3f35D
dWzwTgLISKT2z7txy9OWlQqmJbAdW2VjUWJRx8RdptRxAGCmaGzEndj7wu5bSxOl
tljcDlddv+zIsnULhwVNroMI2PfqoSUjAxNNdsz0b77/uv006Vn4wJvHOgZODs9r
bs1OXH3bFT0A8MoP3rzGrYWRHUscW3LrJ78KADzWtfEX//D6raHrLgbJYqK+8 c0r
7 /3 k3wFA9wtPby6OD2+QJPx1f/CprwFAEAR08p+f3Vg+O3idbTtDmaWrukYO77v3
PLUzYEpZWnLXR79z4vkfPhgGfkuyfeGrjWuuPVLoO9ZeOLb/9 wBGrGn+m5FbbgrK
xRVWXeP++rWbd2k9eW6Nv/3 i76rAb3fSDe+2 LF9xkAtn20eP7Y03OWJ/hqsHGhnj
RmzIMXyJZCRE2kkmWBuWKwwnqo0OtEaVwm9Py1MbO3M4sWDpqGVZGkEgTz73v/6 a
Vdg5JSuCgrfeHxp63V68csixbQUA7fXV1sb66lVSIq6ZiIgAgrnjx6/9 YWGk2Eog
lCfKGP3xeKdXCV6/8 gMrT0+Nx3tePrhZay0BYOkVC/s7VswbJyG4e/eJNRPD+fax
vvHSNbevO/6 zJ5//8 NmB8fkA8IF7Noy1NhRadv7gRw/3 HT59+8 zzoTjcf+3 Or/2 X
j131wMMPWYl4xT+Ruw8A9v3o67zho3/0 lGEYnO858gSzrkMiuaPU2xMGpdzvzbIG
BKBIkPiumxv9GLNO1IbY4FUbuif27fgrrVUGRH7LNTd/f3DHM59hFXbqwFsshOgS
Ahj+xbMPBLnRfwsAtdBdJFav3U+JTCiEHQTaqwtNjgeWbYhs5MiAZFIppEtjQ2f7
Tx7p6+7 uHh4anTjh+cEOv1bl0PMQeX5kWlYIAH2v/mTrNCAkjAlhWCcBUkQCjm2r
sZ4DC4TQQpgSphG1EYEkgyiKDHN0ou32Dy4/3 dBcN7Zm07K9hikDAOj+Zc8qSDCg
sffnB5ZprSVo0vj3Pb/veiGFnhnFMVjs+buua6cBWXPt8t1XbF7Znzv+1 sdPHz59
BwMkhFDJbPK0YVrDIIB11Hzw77/7 vQ/+/m+NJLPJPgBw82N/AL9odr/y003Mug4A
L7/5 nq8QBGhSAGXFkzuFYfVOzy3kewGZIELvc3/z37RWGQC6cc3GTycaWovTlqUj
xSGzO7D7tSWlgVOfcMtF1Io5FEfOBvv27Rno2dd1wnOLxYCNdJnr6uoCWxrjdVUp
AicWkZEoj44O9Z7Njezsy+V6RouDrosHP7u+uR8A9faeHPz817cfTSQS9OjquuuE
lIBh/nN1zYc/nonFpF3qn18oV0q93/rSlzkKbj27++UzVz7xwNOCoIzTQ0tF4Kco
VA4ydWP1McO6+bpFZ8dGSg1i6oBsTpiW0Te8SFRq2Z6u4ytAgG0Zyg8iOTZSqpen
+i7Tixcen3anKtTW3l09qwnAwo768Vu2rOnlILR/+cL+jQSAhFAPfeF3flRXn/II
wv/Hp166uf/E0MrA9ebR8L5P/u6DG45+/2 uvdTCzsXf7d/7 ULVfaAcBwnAMNi5bl
B3bv5Cmle1c99JkvvPv3336wenbgU1prlAvVilcts4pCVEuFtRxGHUpFiIzY5/a8
e/qliefe1FfqvgBKwbCkWmu+dtn+rlf+AjPC5pB1uPv4sxNXL23mJU2pRq1VC4fa
Ga73pQEArIkRzQrIL0K3tFjLtFJCK4XBXO1L2596ajqEzQNQn13f3EQAvIqdkuqM
oomyMs6OmNDMDNSMEuIA1D/86 MCywZFqioggpOB7r08NGoNHUuVqQKeOdjtEhHtu
uazvH1/vXcwM2vXSrvZrH6TD7vCAUxopAUQWEcEyhbrngaV96Dk0T0sZDfWcyLhu
iIbmRCnbe2gBBhDqtoYzH7yjbdeTf/L2Sgbj4HOvtW6+ftHJdJ135MSh4dVj/aeu
B0/e2SrKfuTpz/+H7o3ct9lghmZWN9265eBjaxtHYpMWwp947LHTn1hm81RY0wEA
6 Zbkmcf+6 y3xznVP1gDQ5eubWIBAkuTrT+34 MhgOAy4DowLoBIA7tqzIjvfkwMwg
EEsxiZloLCUUseWZQlRYIm7b0okbLOKzwFBT0UTvhDs4XbekM/1 bT3/795 d99ctb
Wv/nl+9 sfvVnH1/7 +W888OL6D634+Wc/s3mH3T2w1syVWwE2MOmJSE3tlnWrGseW
d2ZypoEoCkP65k/2 r4QK+dlXe9rDwEcYeMjlC4ZQfhi4NezqOjHP7DmxNKoVTbdS
Qlgr61qpgMJETn7vJ291ciVvUnE8JlRNu5USckPjCVnNx2QhX2ee7Ft88IV9lwde
DaHnorM9lo9KRfOhDy16l7UKVBgKFYWkVdT9jT29h99++23 FES9gZghA97/7 +Eeu
uXHp9QBAgsTxrkc/Kw1pAoA0ZMAACiOVjr0vHdm456VHbgAAgcmoJfKiNX4taAHA
nmn8Gwb7U7rA7XdfsfHu+9 etS9THswbJsjIi16h4Soi0jshUZSJVNA0rmYxbySbD
lLbjzA4BAUAeKHpVZs4DQJCv/Ymz78SPr1He992dh3+xcGjkK4VfHL8p1312Xd+B
wVWi6jaKfHUe9Pkx/O5DI/UnzxTr7t+y7HRTNuYBQBAoCQDdpyfqgcmb8yu7znTU
fGUygHzJi5VHSw3Tg8TiZrhmWcMYABw9MdH4866+VjBj5eL6PADUvND66g/eWdnT
X0y+uvNUx4svHbuaAUhDqPaYqFHFYxovWxtWNh6YHvOGtS3P9f/3 m+46 +6 UPfKQh
Ke8EA/G6mO/kSwvNiJPTfILYmb5QLljefNRJ2kUA2PnTd+7 O9Y1f/Y3/cef8WMpO
Ta3DAIDLNix85Q+33 mElUk4aAOqb6lobsvbClo661U0tmTY7RuVEGJXQ1BQZ6XRJ
lQr1FSVQqgqxyLasVEPacVJFFcRi3sxLFgFAPA4jnXEeL5f872rN9Npb/R3TJoww
iv3sme4l+aLnDI2U0yuX1L8r5kgmP7+jt9PzlfHFnrcbp+sScSs4fCKXDoLJiOuK
y5rGTGMyHbPv6FgzM9MzO04vOJcSYOCBLcuO//lIJZEv+fFXdp3paG1O1G7buODY
vkOjyYoXpgdHKqm/3 n5w1cy5b7+u47AOlccVb4wZOD1QvAYAHFNWb1yajSPQNzy3
/+xVxWq0CAA608aw6DqeEqXKuY2lNAvGe5eyj/6 nD//g2//xnx7Rio2Xvt31+I2P
bN57esaNrXFe+sydD19/CMBVQpIBAKYpLCkoHXesxsa2VG5gpFJMxYJqqq2sxCrc
F0VOwWPJpZjJYcKwGxrqE9m2tLSyk9YybgjypJSlu1Y1xY9+4 YY/fvyjV336Uw9d
eaSh3nGFmMxV2ZaMYjEj6mxPlYnAne11JTBDaz1ZZiSNrr68ZTRmy5AIICLOph33
4 ftXHzvYM5q1TKma6mO1+29 b0vPbtyzpvedDy/ovW5jJW5ZUYxPVWCZle5YlVDZp
uexHxX9397KXE45RM6UInnnl1Lxoonzqj+9 e9sNFzfFjUtB0Wobjlizfe13Hc2vb
k3vCopeLFJPSTPlq2GAK4W9cmv0lM4gBysatshQUNWfsgXs2zHuLASTAVdMQgWMb
nvNW9+WppOWZpgibU6bRZJO15aGrnzctwyMBHHv5yFYnZecMS/jxjDPxsSfu/OnU
PqJkKl40LOGnsrEiR+wEXiT9ql8wRFh2AwTrh+9 SxAB1fW6TMxoFbZUgcVXJjxbl
q95Af6548nDvWG7Tokzy0zd1PqZZh6YhkkYylrXrYvNB526s76Wc50oSnU8X5MtI
iAv6qKo/oqr+uIyZWRG360mQpf2ooP2wqGt+yWpOr2TFgSrVBlQY1cDMUHxBnm3G
pAQAJIUkKSwdRO5FBWKQZn1hHmuK0W7NLIw0ahSFEMk4aQFQ3BGs2fY6Gnu0bfms
eMZwU3MDYDCIIZi15FDHAk9nB4+MjA0dGX/dYn/PPJuGNj3Z5cknmLHgrQF9JjwA
JU1olhmCqHeEoISF4NFr2+5 yTNFg1sXbCcRky4S0ZJKmc780fZuYLDyjzNQ2vffn
/MJMzExaM6kwrEZVfzSq+SUQDJYko5pf1JVgJHKDIphJhdrlUFU5jGrKD6usWDNP
XfcvUibzmiBmZhUqxVNzThfNLHi6TPFOynbB2kRU8YqIlIpc31UVNwxztbJF3KYK
Vc/OlTvt0XwHImUaXphQMdN1hic6IUQk3CBueGFceEEcGrb2oobxs7Xy2KniQcOv
7 XdSleGbk3dV8frrfC51f2Tb/VZ/4 VRDzo1d5mlxRdWNDDf0Ru9dHrvNdgzbjFtJ
JsCwjbh0rMzFduUMAC7aQGAGnXfYMADU+if2AwCZ0iCCJAipo8iDvjDbPMVnc6j8
S8kyF73fo9bMNPzcT3nniwEBISzT0X7kClPadkNyoZDCApEAAZFjF2UUOay0TUrb
kSbzrE+Hx0bdY0NDlRfmpYPusUQtd9/WQwEw85GLiLo+t8kZ88OGCscWR5FYmomp
FcszWOUYZEhDQlpS2pl4q5CCiMCzbV9P2r5iAgkSc197mFlrDqBZaaUCDiLPSDjZ
yA8qQa42zFMC0ZSlkSCAL8jq/ko0nYf6l9DFUv4gJjCxMKUNzVpY0tJKKxAZ0rZS
RszKMsGMmNRgLjg4OBF11WrhO3GXe5sy0cSmJ7u86ddH473ZmF/ets1fP/RMrjUe
hAXYxZKnC6eLRmibaEmmZF2dYaSFIkhoYgYiNygySJgxM0XECN2oypqVNA2HBLMw
yJxjWVwbr+UjL/RIkDDjZlxP1PIcKqW1SDGfvzfpPTj+NR6/pnLR/yJM3qfTVLM/
JXAYAYDQGqgV3bFKWO1Tpq0DjfHhQrArYYlTdeSOaFOXNj2517voczAAEBE9/cRq
c7HrxAZ9M+PVzNYAlDKESNgOWhMGtYFgCQKiUGs9JYMQk4ehNISQBhlgYjUVcpGE
kNIQREDoh4EOzz+UiZg0n/8 +/38 bXcrlMTNrAHKGS6bJI4wZOiiH6GfNOc2yJiks
J8xotC2u8qdinnv/E4dDngXCRX9ihG3bxBt4w4rlXCvPpi0UOSXFSZcoboJNkvI3
v2a5BEUApFLMQgRQ2o1Lv5KJxV0n9AK3PhbchJsCbN06p1u+OChTtG3bNnEj3hDu
xICcKCSMRaYnjGSGyrHoN6C8D6Vcg6NKgXtDRzdkqlGsYb7agZv01ouAMU3/G2jy
rVebJ+JFAAAAAElFTkSuQmCC"/>
</picture_list>
</tovar>
<tovar name="Услуга 1 " price="32 "/>
<tovar name="Услуга 2 " price="15 "/>
</price_list>
Источник
Категория:
JSON, XML, TXT, CSV, DBF Отдаем PDF файл через Web-сервис В инфраструктурах, активно использующих возможности web-сервисов 1С, нередко возникает потребность получения не только массивов данных из базы, но и различных файлов. Сам файл через веб-сервис так просто не передашь, но на его основе можно создать объект ДвоичныеДанные, который, в свою очередь, уже сериализуется в base64Binary. После такой операции наш веб-сервис без проблем передает данные и получателю остается только выполнить на своей стороне обратное преобразование и сохранить файл.
В качестве примера такого механизма я буду создавать в 1С счет на оплату на основании переданных через сервис ИНН контрагента и суммы, и возвращать PDF печатной формы. На этот раз, кроме примеров кода, дополнительно был записан скринкаст разработки.
Для начала создадим в пустой конфигурации справочник "Контрагенты" с реквизитом "ИНН" и документ "Счет" с реквизитами "Контрагент" и "СуммаДокумента".
Теперь добавим пакет XDTO "test_ws"с пространством имен "http://www.test-ws.org", в котором опишем тип объекта "File". Он будет содержать свойства:
binaryData - (base64Binary (http://www.w3.org/2001/XMLSchema));
ext - string (http://www.w3.org/2001/XMLSchema);
message - string (http://www.w3.org/2001/XMLSchema).
Создаем web-сервис "DocWork", пространство имен "http://www.test-ws.org", выбираем пакет "http://www.test-ws.org". Добавляем в сервис операцию "CreateBill", возвращаемый тип File (http://www.test-ws.org), входные параметры:
INN - string (http://www.w3.org/2001/XMLSchema);
Summ - decimal (http://www.w3.org/2001/XMLSchema).
Код web-сервиса:
Код 1C v 8.3 Функция CreateBill(INN, Summ)
typeFile = ФабрикаXDTO. Тип( "<a href=" http:
текФайл = ФабрикаXDTO. Создать( typeFile) ;
текФайл. binaryData = ФабрикаXDTO. Создать( ФабрикаXDTO. Тип( "<a href=" http:
текФайл. ext = ФабрикаXDTO. Создать( ФабрикаXDTO. Тип( "<a href=" http:
Если ПустаяСтрока( INN) ИЛИ Summ = 0 Тогда
текФайл. message = "empty data" ;
Возврат текФайл;
КонецЕсли ;
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Контрагенты.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН" ;
Запрос. УстановитьПараметр( "ИНН" , INN) ;
Результат = Запрос. Выполнить( ) . Выгрузить( ) ;
Если Результат. Количество( ) = 0 Тогда
текФайл. message = "client not found" ;
Возврат текФайл;
КонецЕсли ;
СчетДок = Документы. Счет. СоздатьДокумент( ) ;
СчетДок. Дата = ТекущаяДата( ) ;
СчетДок. Контрагент = Результат[0 ]. Ссылка;
СчетДок. СуммаДокумента = Summ;
СчетДок. Записать( ) ;
ТабДок = Новый ТабличныйДокумент;
Документы. Счет. Печать( ТабДок, СчетДок. Ссылка) ;
ИмяФайла = ПолучитьИмяВременногоФайла( "pdf" ) ;
ТабДок. Записать( ИмяФайла, ТипФайлаТабличногоДокумента. PDF) ;
ДанныеФайла = Новый ДвоичныеДанные( ИмяФайла) ;
текФайл. binaryData = ДанныеФайла;
текФайл. message = "ok" ;
текФайл. ext = "pdf" ;
Возврат текФайл;
КонецФункции < br>
Тестовая обработка
Код 1C v 8.3 &НаСервере
Функция ПолучитьПДФ()
ОпределениеВС = Новый WSОпределения( "<a href=" http:
СсылкаВС = Новый WSПрокси( ОпределениеВС, "<a href=" http:
ФайлСервис = СсылкаВС. CreateBill( ИНН, Сумма) ;
Возврат ФайлСервис. binaryData;
КонецФункции
&НаКлиенте
Процедура СоздатьСчет(Команда)
мДанные = ПолучитьПДФ( ) ;
Если мДанные = Неопределено Тогда
Возврат ;
КонецЕсли ;
мДанные. Записать( "c:\temp_bil.pdf" ) ;
КонецПроцедуры < br>
А так же обещанное видео, как есть, без купюр
Источник
Категория:
WEB-сервисы, WS-ссылки, XDTO-пакеты Запись во внешний источник данных из 1С 8.2 Начиная с платформы 8.2.14 в 1С появилась коллекция "Внешние источники данных ". Использование объектов этой коллекции позволяет работать с внешними данными через ODBC. Стандартные механизмы платформы позволяют просматривать данные и использовать их в запросах. Тем не менее, на примере взаимодействия с SQL покажу возможность работы с внешними источниками на прямое добавление/изменение данных SQL из 1С.
Создадим для начала через консоль сервера SQL базу "test" с таблицей "assortment", строковые поля id, name, price. Сделаем ключевым поле id и внесем пару строк в таблицу. Потом создадим пустую базу 1С, в конфигураторе добавим внешний источник данных "ВнешнийSQL". На вкладке "Данные" добавим нашу таблицу. Можно ввести строку соединения, либо воспользоваться конструктором строки. В моей строке указаны явно учетная запись суперадминистратора (sa) и пароль к ней. Поскольку это сервер для тестов, вопросом безопасности можно пренебречь. Для реальной базы такого делать не стоит, либо можно завести отдельного пользователя с правами чтения/записи только на эту базу и хранить его данные.
После подключения находим в списке таблиц нашу, выбираем необходимые поля, в нашем случае все.
После добавляем формы для объекта и списка.
Если запустить нашу конфигурацию сейчас, то элементы формы списка будут открываться только на просмотр.
Теперь начинаем вносить изменения в формы, начнем с формы объекта. В свойствах реквизита "Объект" убираем галку "Сохраняемые данные", после этого реквизиты формы будут доступны для редактирования. Так же добавляем команду "ЗаписатьДанные" и прописываем код сохранения данных.
Код 1C v 8.3 &НаСервере
Процедура ЗаписатьСервер()
пСеанс = ВнешниеИсточникиДанных. ВнешнийSQL. ПолучитьОбщиеПараметрыСоединения( ) ;
Если НЕ пСеанс. СУБД = "MSSQLServer" Тогда
Возврат ;
КонецЕсли ;
ЗапросSQL = ? ( Объект. Ссылка. Пустая( ) , ПолучитьЗапросДобавления( ) , ПолучитьЗапросОбновления( ) ) ;
Connection = Новый COMОбъект( "ADODB.Connection" ) ;
Command = Новый COMОбъект( "ADODB.Command" ) ;
RecordSet = Новый COMОбъект( "ADODB.RecordSet" ) ;
Попытка
Connection. Open( СокрЛП( пСеанс. СтрокаСоединения) ) ;
Command. ActiveConnection = Connection;
Command. CommandText = ЗапросSQL;
RecordSet = Command. Execute( ) ;
Исключение
Сообщить( ОписаниеОшибки( ) ) ;
КонецПопытки ;
КонецПроцедуры
&НаСервере
Функция ПолучитьЗапросОбновления()
мДанные = Объект. Ссылка. Метаданные( ) ;
СтрокаПоля = "" ;
СтрокаДанные = "" ;
ДанныеОбъект = Объект. Ссылка. ПолучитьОбъект( ) ;
Для Каждого мПоле Из мДанные. Поля Цикл
Если Объект[мПоле. Имя] = ДанныеОбъект[мПоле. Имя] Тогда
Продолжить;
КонецЕсли ;
СтрокаДанные = СтрокаДанные + ? ( ПустаяСтрока( СтрокаДанные) , " SET " , ", " ) + мПоле. Имя + "= '" + Объект[мПоле. Имя] + "'" ;
КонецЦикла ;
ЗапросSQL = "UPDATE " + мДанные. ИмяВИсточникеДанных + СтрокаДанные + "WHERE (id = '" + ДанныеОбъект. id + "')" ;
Возврат ЗапросSQL;
КонецФункции
&НаСервере
Функция ПолучитьЗапросДобавления()
мДанные = Объект. Ссылка. Метаданные( ) ;
СтрокаПоля = "" ;
СтрокаДанные = "" ;
Для Каждого мПоле Из мДанные. Поля Цикл
СтрокаПоля = СтрокаПоля + ? ( ПустаяСтрока( СтрокаПоля) , " (" , ", " ) + мПоле. Имя;
СтрокаДанные = СтрокаДанные + ? ( ПустаяСтрока( СтрокаДанные) , " VALUES (" , ", " ) + "'" + Объект[мПоле. Имя] + "'" ;
КонецЦикла ;
СтрокаПоля = СтрокаПоля + ")" ;
СтрокаДанные = СтрокаДанные + ")" ;
ЗапросSQL = "INSERT INTO " + мДанные. ИмяВИсточникеДанных + СтрокаПоля + СтрокаДанные;
Возврат ЗапросSQL;
КонецФункции
&НаКлиенте
Процедура ЗаписатьДанные(Команда)
ЗаписатьСервер( ) ;
Оповестить( "ОбновитьВнешнийИсточникДанных" ) ;
КонецПроцедуры
Теперь в форме списка на панель вешаем команду "Добавить" и добавляем обработку оповещения.
Код 1C v 8.3 &НаКлиенте
Процедура Добавить(Команда)
ОткрытьФорму( "ВнешнийИсточникДанных.ВнешнийSQL.Таблица.dbo_assortment.ФормаОбъекта" ) ;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ОбновитьВнешнийИсточникДанных" Тогда
Элементы. Список. Обновить( ) ;
КонецЕсли ;
КонецПроцедуры
Вот и все, теперь мы можем как добавлять, так и редактировать данные таблицы. При необходимости можно добавить дополнительный контроль ввода, автонумерацию, удаление и прочие механизмы.
Источник
Категория:
Внешние источники данных Программное создание динамического списка для регистра сведений Код 1C v 8.х &НаСервере
Процедура ИзменитьНаСервере(ИмяРеквизита)
Если Элементы. Найти( ИмяРеквизита) = Неопределено Тогда
МассивРеквизитов = Новый Массив;
МассивРеквизитов. Добавить( Новый РеквизитФормы( ИмяРеквизита, Новый ОписаниеТипов( "ДинамическийСписок" ) , , "Поле таблицы" ) ) ;
ЭтаФорма. ИзменитьРеквизиты( МассивРеквизитов) ;
ЭтаФорма[ИмяРеквизита]. ОсновнаяТаблица = "РегистрСведений." + ИмяРеквизита;
Элемент = Элементы. Добавить( ИмяРеквизита, Тип( "ТаблицаФормы" ) , ЭтаФорма) ;
Элемент. ПутьКДанным = ИмяРеквизита;
Элемент. Видимость = Истина ;
КолонкаКод = Элементы. Добавить( "Код" + ИмяРеквизита, Тип( "ПолеФормы" ) , Элементы[ИмяРеквизита]) ;
КолонкаКод. Вид = ВидПоляФормы. ПолеВвода;
КолонкаКод. ПутьКДанным = ИмяРеквизита + ".Код" ;
КолонкаНаименование = Элементы. Добавить( "Наименование" + ИмяРеквизита, Тип( "ПолеФормы" ) , Элементы[ИмяРеквизита]) ;
КолонкаНаименование. Вид = ВидПоляФормы. ПолеВвода;
КолонкаНаименование. ПутьКДанным = ИмяРеквизита + ".Наименование" ;
КонецЕсли ;
Если ТекущийСписок < > ИмяРеквизита Тогда
Если НЕ ПустаяСтрока( ТекущийСписок) Тогда
Элементы[ТекущийСписок]. Видимость = Ложь ;
конецЕсли ;
Элементы[ИмяРеквизита]. Видимость = Истина ;
ТекущийСписок = ИмяРеквизита;
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура АдресныеСокращения(Команда)
ИзменитьНаСервере( "АдресныеСокращения" ) ;
КонецПроцедуры
&НаКлиенте
Процедура АдресныйКлассификатор(Команда)
ИзменитьНаСервере( "АдресныйКлассификатор" ) ;
КонецПроцедуры
Пример
Категория:
1С Бухгалтерия 2.0 Обход метаданных (полезные функции) При написании небольших автоматизированных тестов часто надо обойти всю конфигурацию и проверить, например, для всех форм какое-нибудь свойство. Это всё легко делается через свойство глобального контекста "Метаданные", но чтоб дорбаться до обхода реквизитов надо написать кучу вложенных циклов. При этом код становится слабочитаемым и слабомодифицируемым.
Ниже приведен небольшой модуль, который решает задачу легко и удобно. Создана специальная функция РазвернутьСтрокуОбходаМетаданных, которая может по строке типа "Метаданные.Справочники.*.Реквизиты.*" построить массив строк с перечислением всех реквизитов всех справочников. При помощи этой и нескольких других функций в экспортных функциях модуля реализованы вполне прикладные задачи - получение всех реквизитов, всех макетов, всех форм конфигурации и построение таблицы всех составных типов.
Код 1C v 8.х
Функция РазвернутьСтрокуОбходаМетаданных(СтрокаОбхода, ЗаменяемоеЗначение = "*" , ПредставлениеПоУмолчанию = "" )
Рез = Новый Массив;
ЧастиСтрокиОбхода = РазобратьСтрокуОбхода( СтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию) ;
Если ЧастиСтрокиОбхода = Неопределено тогда
Рез. Добавить( СтрокаОбхода) ;
Иначе
ОбъектКоллекции = Вычислить( ЧастиСтрокиОбхода. СтрокаКоллекции) ;
РазвернутаяКоллекция = РазвернутьКоллекциюВПредставления( ОбъектКоллекции, ЧастиСтрокиОбхода. СтрокаПредставление) ;
Для каждого ЭлементРазвернутойКоллекции Из РазвернутаяКоллекция Цикл
ТекущаяСтрокаОбхода = ЧастиСтрокиОбхода. СтрокаНачало + ЭлементРазвернутойКоллекции + ЧастиСтрокиОбхода. СтрокаКонец;
МассивЭлемента = РазвернутьСтрокуОбходаМетаданных( ТекущаяСтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию) ;
Для каждого ПримитивныйЭлементОбхода Из МассивЭлемента Цикл
Рез. Добавить( ПримитивныйЭлементОбхода) ;
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
Возврат Рез;
КонецФункции
Функция РазобратьСтрокуОбхода(СтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию)
Если ПустаяСтрока( ЗаменяемоеЗначение) Тогда
ВызватьИсключение "Некорректное выражение заменяемого значения" ;
КонецЕсли ;
ПозицияЗамены = Найти( СтрокаОбхода, ЗаменяемоеЗначение) ;
Если ПозицияЗамены = 0 Тогда
Возврат Неопределено ;
КонецЕсли ;
СтрокаНачало = Лев( СтрокаОбхода, ПозицияЗамены - 1 ) ;
СтрокаКоллекции = СтрокаНачало;
Если Прав( СтрокаКоллекции, 1 ) = "." Тогда
СтрокаКоллекции = Лев( СтрокаКоллекции, СтрДлина( СтрокаКоллекции) - 1 ) ;
КонецЕсли ;
ПозицияОкончанияЗамены = ПозицияЗамены + СтрДлина( ЗаменяемоеЗначение) ;
ОстатокВыражения = Сред( СтрокаОбхода, ПозицияОкончанияЗамены) ;
ОткрывающаяСкобка = "[" ;
ЗакрывающаяСкобка = "]" ;
Если Найти( ОстатокВыражения, ОткрывающаяСкобка) = 1 Тогда
ОстатокВыражения = Сред( ОстатокВыражения, СтрДлина( ОткрывающаяСкобка) + 1 ) ;
ПозицияЗакрывающейСкобки = Найти( ОстатокВыражения, ЗакрывающаяСкобка) ;
Если ПозицияЗакрывающейСкобки = 0 Тогда
ВызватьИсключение "Синтаксическая ошибка разбора выражения" ;
КонецЕсли ;
СтрокаПредставление = Лев( ОстатокВыражения, ПозицияЗакрывающейСкобки - 1 ) ;
ОстатокВыражения = Сред( ОстатокВыражения, ПозицияЗакрывающейСкобки + СтрДлина( ЗакрывающаяСкобка) ) ;
Иначе
СтрокаПредставление = ПредставлениеПоУмолчанию;
КонецЕсли ;
СтрокаКонец = ОстатокВыражения;
Рез = Новый Структура( "ПозицияЗамены, СтрокаНачало, СтрокаКоллекции, СтрокаПредставление, СтрокаКонец" ,
ПозицияЗамены, СтрокаНачало, СтрокаКоллекции, СтрокаПредставление, СтрокаКонец) ;
Возврат Рез;
КонецФункции
Функция РазвернутьКоллекциюВПредставления(Коллекция, Знач ПредставлениеЭлемента = "" )
Если не ПустаяСтрока( ПредставлениеЭлемента) Тогда
Если Найти( ПредставлениеЭлемента, ";" ) > 0 Тогда
ВызватьИсключение "Некорректное выражение представления" ;
КонецЕсли ;
ПредставлениеЭлемента = "." + ПредставлениеЭлемента;
КонецЕсли ;
Рез = Новый Массив;
Для каждого ЭлементКоллекции Из Коллекция Цикл
ТекПредставление = Строка( Вычислить( "ЭлементКоллекции" + ПредставлениеЭлемента) ) ;
Рез. Добавить( ТекПредставление) ;
КонецЦикла ;
Возврат Рез;
КонецФункции
Функция РазвернутьМассивСтрокОбходаМетаданных(МассивСтрокОбхода, ЗаменяемоеЗначение = "*" , ПредставлениеПоУмолчанию = "Имя" )
Рез = Новый Массив;
Для каждого СтрокаОбхода Из МассивСтрокОбхода Цикл
ДополнениеРезультата = РазвернутьСтрокуОбходаМетаданных( СтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию) ;
Для каждого ТекСтрока Из ДополнениеРезультата Цикл
Рез. Добавить( ТекСтрока) ;
КонецЦикла ;
КонецЦикла ;
Возврат Рез;
КонецФункции
Функция ПолучитьМассивСтрокМногострочнойСтроки(ПреобразуемаяСтрока, ИгнорироватьПустые = Истина, СокращатьПробелы = Истина)
Рез = Новый Массив;
ЧислоСтрок = СтрЧислоСтрок( ПреобразуемаяСтрока) ;
Для Сч = 1 По ЧислоСтрок Цикл
ТекСтрока = СтрПолучитьСтроку( ПреобразуемаяСтрока, Сч) ;
Если ИгнорироватьПустые и ПустаяСтрока( ТекСтрока) Тогда
Продолжить;
КонецЕсли ;
Если СокращатьПробелы Тогда
ТекСтрока = СокрЛП( ТекСтрока) ;
КонецЕсли ;
Рез. Добавить( ТекСтрока) ;
КонецЦикла ;
Возврат Рез;
КонецФункции
Функция ПолучитьВсеХранимыеРеквизитыКонфигурации() Экспорт
СтрокаВсехРеквизитов =
"
|Метаданные.Константы.*
|Метаданные.ПланыОбмена.*.Реквизиты.*
|Метаданные.ПланыОбмена.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Справочники.*.Реквизиты.*
|Метаданные.Справочники.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Документы.*.Реквизиты.*
|Метаданные.Документы.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Последовательности.*.Измерения.*
|Метаданные.ПланыВидовХарактеристик.*.Реквизиты.*
|Метаданные.ПланыВидовХарактеристик.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.ПланыСчетов.*.Реквизиты.*
|Метаданные.ПланыСчетов.*.ПризнакиУчета.*
|Метаданные.ПланыСчетов.*.ПризнакиУчетаСубконто.*
|Метаданные.ПланыСчетов.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.ПланыВидовРасчета.*.Реквизиты.*
|Метаданные.ПланыВидовРасчета.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.РегистрыСведений.*.Измерения.*
|Метаданные.РегистрыСведений.*.Ресурсы.*
|Метаданные.РегистрыСведений.*.Реквизиты.*
|Метаданные.РегистрыНакопления.*.Измерения.*
|Метаданные.РегистрыНакопления.*.Ресурсы.*
|Метаданные.РегистрыНакопления.*.Реквизиты.*
|Метаданные.РегистрыБухгалтерии.*.Измерения.*
|Метаданные.РегистрыБухгалтерии.*.Ресурсы.*
|Метаданные.РегистрыБухгалтерии.*.Реквизиты.*
|Метаданные.РегистрыРасчета.*.Измерения.*
|Метаданные.РегистрыРасчета.*.Ресурсы.*
|Метаданные.РегистрыРасчета.*.Реквизиты.*
|Метаданные.БизнесПроцессы.*.Реквизиты.*
|Метаданные.БизнесПроцессы.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Задачи.*.Реквизиты.*
|Метаданные.Задачи.*.РеквизитыАдресации.*
|Метаданные.Задачи.*.ТабличныеЧасти.*.Реквизиты.*
|" ;
ВсеХранимыеРеквизитыКонфигурации = РазвернутьМассивСтрокОбходаМетаданных( ПолучитьМассивСтрокМногострочнойСтроки( СтрокаВсехРеквизитов) ) ;
Возврат ВсеХранимыеРеквизитыКонфигурации;
КонецФункции
Функция ПолучитьВсеХранимыеРеквизитыКонфигурацииСоставногоТипа() Экспорт
ВсеХранимыеРеквизитыКонфигурации = ПолучитьВсеХранимыеРеквизитыКонфигурации( ) ;
Рез = Новый ТаблицаЗначений;
Рез. Колонки. Добавить( "Имя" , Новый ОписаниеТипов( "Строка" ) ) ;
Рез. Колонки. Добавить( "Тип" , Новый ОписаниеТипов( "ОписаниеТипов" ) ) ;
Рез. Колонки. Добавить( "КоличествоПростыхТипов" , Новый ОписаниеТипов( "Число" ) ) ;
Для каждого ТекРеквизит Из ВсеХранимыеРеквизитыКонфигурации Цикл
Реквизит = Вычислить( ТекРеквизит) ;
Тип = Реквизит. Тип;
КоличествоПростыхТипов = Тип. Типы( ) . Количество( ) ;
Если КоличествоПростыхТипов< > 1 Тогда
ТекСтрока = Рез. Добавить( ) ;
ТекСтрока. Имя = ТекРеквизит;
ТекСтрока. Тип = Тип;
ТекСтрока. КоличествоПростыхТипов = КоличествоПростыхТипов;
КонецЕсли ;
КонецЦикла ;
Возврат Рез;
КонецФункции
Функция ПолучитьВсеФормыКонфигурации() Экспорт
СтрокаВсехРеквизитов =
"
|Метаданные.ПланыОбмена.*.Формы.*
|Метаданные.КритерииОтбора.*.Формы.*
|Метаданные.ОбщиеФормы.*
|Метаданные.Справочники.*.Формы.*
|Метаданные.Документы.*.Формы.*
|Метаданные.ЖурналыДокументов.*.Формы.*
|Метаданные.Перечисления.*.Формы.*
|Метаданные.Отчеты.*.Формы.*
|Метаданные.Обработки.*.Формы.*
|Метаданные.ПланыВидовХарактеристик.*.Формы.*
|Метаданные.ПланыСчетов.*.Формы.*
|Метаданные.ПланыВидовРасчета.*.Формы.*
|Метаданные.РегистрыСведений.*.Формы.*
|Метаданные.РегистрыНакопления.*.Формы.*
|Метаданные.РегистрыБухгалтерии.*.Формы.*
|Метаданные.РегистрыРасчета.*.Формы.*
|Метаданные.БизнесПроцессы.*.Формы.*
|Метаданные.Задачи.*.Формы.*
|" ;
ВсеФормыКонфигурации = РазвернутьМассивСтрокОбходаМетаданных( ПолучитьМассивСтрокМногострочнойСтроки( СтрокаВсехРеквизитов) ) ;
Возврат ВсеФормыКонфигурации;
КонецФункции
Функция ПолучитьВсеМакетыКонфигурации() Экспорт
СтрокаВсехРеквизитов =
"
|Метаданные.ПланыОбмена.*.Макеты.*
|Метаданные.ОбщиеМакеты.*
|Метаданные.Справочники.*.Макеты.*
|Метаданные.Документы.*.Макеты.*
|Метаданные.ЖурналыДокументов.*.Макеты.*
|Метаданные.Перечисления.*.Макеты.*
|Метаданные.Отчеты.*.Макеты.*
|Метаданные.Обработки.*.Макеты.*
|Метаданные.ПланыВидовХарактеристик.*.Макеты.*
|Метаданные.ПланыСчетов.*.Макеты.*
|Метаданные.ПланыВидовРасчета.*.Макеты.*
|Метаданные.РегистрыСведений.*.Макеты.*
|Метаданные.РегистрыНакопления.*.Макеты.*
|Метаданные.РегистрыБухгалтерии.*.Макеты.*
|Метаданные.РегистрыРасчета.*.Макеты.*
|Метаданные.БизнесПроцессы.*.Макеты.*
|Метаданные.Задачи.*.Макеты.*
|" ;
ВсеМакетыКонфигурации = РазвернутьМассивСтрокОбходаМетаданных( ПолучитьМассивСтрокМногострочнойСтроки( СтрокаВсехРеквизитов) ) ;
Возврат ВсеМакетыКонфигурации;
КонецФункции
Категория:
Метаданные Импорт в 1С из текстовых файлов (TXT, CSV) Не редко возникает необходимость загрузить в справочники или документы 1С данные из текстового файла. Приведенный пример внешней обработки позволит преобразовать текстовый файл с известным разделителем данных в поле табличного документа для последующей обработки уже внутри 1С:Предприятия. Обработка содержит функцию разбора строки на массив данных, настраиваемый разделитель строки текста на "столбцы", процедуру чтения данных из текстового файла.
Разбор строки в массив с использованием функций из конфигурации 1С
Для разложения строки в массив в конфигурация 1С:Бухгалтерия, 1С:Торговля и 1С:УПП имеется замечательная функция - Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт. Функция "расщепляет" строку на подстроки, используя заданный разделитель. Разделитель может иметь любую длину. Если в качестве разделителя задан пробел, рядом стоящие пробелы считаются одним разделителем, а ведущие и хвостовые пробелы параметра "Стр" игнорируются. Подробнее можно прочесть внутри конфигурации - "Общие модули" -> "Общего назначения". Функция возвращает массив значений, элементы которого - подстроки.
Чтение текстового файла (txt) в 1С
Операцию импорта - экспорта текстовых файлов (формат тхт или csv, а также htm, html) очень удобно реализовать при помощи конструкции следующего вида:
1. Функция ПолучитьПотокЧтенияСтрок(Файл) - Назначение: Проверить наличие файла (функция Файл()), Создать текстовый документ (Новый ТекстовыйДокумент()), вызвать метод "Прочитать" для открытия потока чтения файла. Возвращает поток, готовый для чтения.
2. Процедура ЧтениеТХТФайла(Элемент) - Назначение: В цикле произвести последовательное чтение строк файла текстового документа, разбирая на массив колонок данных и добавляя значения массива в табличное поле;
Исходный код 1С функции создания текстового потока чтения файла ТХТ:
Код 1C v 8.х Функция ПолучитьПотокЧтенияСтрок(Файл)
Попытка
ТекстовыйФайл = Новый Файл( Файл) ;
Если ТекстовыйФайл. Существует( ) = Ложь Тогда
Сообщить( "Файла " + Файл+ " не существует!" ) ;
Возврат Неопределено ;
КонецЕсли ;
ПотокЧтенияСтрок = Новый ТекстовыйДокумент( ) ;
ПотокЧтенияСтрок. Прочитать( ТекстовыйФайл) ;
Исключение
Сообщить( "Файл не прочитан." , СтатусСообщения. Внимание) ;
Сообщить( ОписаниеОшибки( ) ) ;
Возврат Неопределено ;
КонецПопытки ;
Возврат ПотокЧтенияСтрок;
КонецФункции
Процедура ЧтениеТХТФайла(Элемент)
Если ПустаяСтрока( ИмяФайла) Тогда
Предупреждение( "Для запуска обработки необходимо предварительно выбрать файл данных." ) ;
Возврат ;
КонецЕсли ;
ПотокСтрок = ПолучитьПотокЧтенияСтрок( ИмяФайла) ;
ТаблицаДокумента. Очистить( ) ;
ТаблицаДокумента. Колонки. Очистить( ) ;
ТаблицаДокумента. Колонки. Добавить( "Номер" , , "Номер" , 5 ) ;
ТаблицаДокумента. Колонки. Добавить( "Артикул" , , "Артикул" , 11 ) ;
ТаблицаДокумента. Колонки. Добавить( "Номенклатура" , , "Номенклатура" , 25 ) ;
ТаблицаДокумента. Колонки. Добавить( "Цена" , , "Цена" , 6 ) ;
КоличествоСтрок = ПотокСтрок. КоличествоСтрок( ) ;
Для Строка = 1 По КоличествоСтрок Цикл
ОбработкаПрерыванияПользователя( ) ;
СтрокаИзФайла = ПотокСтрок. ПолучитьСтроку( Строка) ;
МассивСтрок = ОбщегоНазначения. РазложитьСтрокуВМассивПодстрок( СтрокаИзФайла, "|" ) ;
Стр= ТаблицаДокумента. Добавить( ) ;
Стр. Номер = Строка;
Стр. Артикул = МассивСтрок[0 ];
Стр. Номенклатура = МассивСтрок[1 ];
Стр. Цена = МассивСтрок[2 ];
Состояние( "Обработка строки файла : "
+ "строка " + Строка + " из " + КоличествоСтрок) ;
КонецЦикла ;
ЭлементыФормы. ТаблицаДокумента. Значение = ТаблицаДокумента;
ЭлементыФормы. ТаблицаДокумента. СоздатьКолонки( ) ;
КонецПроцедуры
В данном примере была произведена загрузка из текстового файла в следующем формате:
Код 7754|Процессор Atom 1.7|10,00
5054|Процессор AMD x64|8,99
7546|Мышь Microsoft|45,88
Категория:
JSON, XML, TXT, CSV, DBF Отправка sms из 1C через МТС Коммуникатор Есть сервис МТС Коммуникатор - удобный обмен SMS-сообщениями с Вашими сотрудниками, клиентами и партнерами. Так вот через него мы настроили
отправку СМС клиентам компании из 1С :
Код 1C v 8.2 УП Если ПустаяСтрока( ТелефонКлиента) Тогда
Сообщить( "Не определен телефон экспедитора загрузки" ) ;
Предупреждение( "СМС не может быть отправлено" ) ;
Иначе
Адресат = ТелефонКлиента;
Адресат = СтрЗаменить( СтрЗаменить( Адресат, "(" , "" ) , ")" , "" ) ;
Адресат = СтрЗаменить( СтрЗаменить( СтрЗаменить( Адресат, "." , "" ) , "-" , "" ) , " " , "" ) ;
Адресат = СтрЗаменить( Адресат, "+" , "" ) ;
WinHttp = Новый COMОбъект( "WinHttp.WinHttpRequest.5.1" ) ;
WinHttp. Option( 2 , "Windows-1251" ) ;
WinHttp. Open( "POST" , "http://mtscommunicator.ru/m2m/m2m_api.asmx/SendMessage" , 0 ) ;
WinHttp. SetRequestHeader( "Accept-Language" , "ru" ) ;
WinHttp. SetRequestHeader( "Accept-Charset" , "Windows-1251" ) ;
WinHttp. setRequestHeader( "Content-Language" , "ru" ) ;
WinHttp. setRequestHeader( "Content-Charset" , "Windows-1251" ) ;
WinHttp. setRequestHeader( "Content-Type" , "application/x-www-form-urlencoded" ) ;
ПараметрыPOST = "msid=" + Адресат + "&message=" + ПодготовитьСообщение( ТекстСМС) + "&naming=USER&login=NUMERLOGIN&password=PASSWORD" ;
Ошибка = Ложь ;
ИДСообщения = "" ;
Попытка
WinHttp. Send( ПараметрыPOST) ;
ИмяФайлаЗапроса = ПолучитьИмяВременногоФайла( ) ;
Текст = Новый ЗаписьТекста( ИмяФайлаЗапроса, КодировкаТекста. UTF8) ;
Текст. ЗаписатьСтроку( WinHttp. ResponseText( ) ) ;
Текст. Закрыть( ) ;
Ошибка = ( WinHttp. Status < > 200 ) ;
Исключение
Ошибка = Истина ;
КонецПопытки ;
Если НЕ Ошибка Тогда
Попытка
XMLОтвет = Новый ЧтениеXML;
XMLОтвет. ОткрытьФайл( ИмяФайлаЗапроса) ;
Пока XMLОтвет. Прочитать( ) Цикл
Если XMLОтвет. ТипУзла = ТипУзлаXML. НачалоЭлемента И ( XMLОтвет. Имя = "long" ) Тогда
XMLОтвет. Прочитать( ) ;
ИДСообщения = XMLОтвет. Значение;
Прервать ;
КонецЕсли ;
КонецЦикла ;
Исключение
Ошибка = Истина ;
КонецПопытки ;
КонецЕсли ;
Если Ошибка Тогда
Сообщить( "Не удалось отправить СМС. Проверьте настройки подключения" ) ;
Предупреждение( "СМС не было отправлено" ) ;
Иначе
ПоказатьОповещениеПользователя( "Отправка СМС" , , "СМС-сообщение отправлено " , БиблиотекаКартинок. СМС) ;
КонецЕсли ;
КонецЕсли ;
Функция ПодготовитьСообщение(Сообщение)
ВрСообщение = "" ;
Для ТекСимвол = 1 По СтрДлина( Сообщение) Цикл
Если КодСимвола( Сред( Сообщение, ТекСимвол, 1 ) ) = 10 Тогда
ВрСообщение = ВрСообщение + " " ;
Иначе
ВрСообщение = ВрСообщение + Сред( Сообщение, ТекСимвол, 1 ) ;
КонецЕсли ;
КонецЦикла ;
Сообщение = ВрСообщение;
Сообщение = СтрЗаменить( Сообщение, "%" , "%25" ) ;
Сообщение = СтрЗаменить( Сообщение, " " , "%20" ) ;
Сообщение = СтрЗаменить( Сообщение, "&" , "%26" ) ;
Сообщение = СтрЗаменить( Сообщение, "#" , "%23" ) ;
Сообщение = СтрЗаменить( Сообщение, "*" , "%2A" ) ;
Сообщение = СтрЗаменить( Сообщение, "|" , "%7C" ) ;
Сообщение = СтрЗаменить( Сообщение, "\" , "%5C" ) ;
Сообщение = СтрЗаменить( Сообщение, "/" , "%2F" ) ;
Сообщение = СтрЗаменить( Сообщение, "?" , "%3F" ) ;
Сообщение = СтрЗаменить( Сообщение, "^" , "%5E" ) ;
Возврат Сообщение;
КонецФункции
Категория:
COM-объекты, WMI, WSH