Циклы применяются для выполнения каких либо повторяющихся действий, возможные варианты перебора в цикле:
Перебираем строки с помощью цикла Для каждого
Перебираем строки с помощью цикла Пока
Перебираем строки с помощью цикла Для
Еще вариант, но советую его использовать только в без выходных ситуациях, Если
Примеры циклов
А какой цикл работает быстрее?
Итак, я нашел пять способов, как можно организовать цикл средствами 1С.
Первый вид цикла, назовем его условно «Для По» выглядит так:
Второй вид «Для Каждого»:
Третий «Пока»:
Далее вспомнил ассемблерную молодость & цикл «Если»:
Ну и напоследок «Рекурсия»
Естественно, что относить рекурсию к циклам не совсем корректно, но тем ни менее с её помощью можно добиться похожих результатов. Сразу оговорюсь, что в дальнейшем тестировании рекурсия не участвовала. Во первых все тесты проводились при 1 000 000 итераций, а рекурсия выпадает уже при 2 000. Во вторых скорость рекурсии в десятки раз меньше, чем скорость остальных циклов.
Последнее отступление. Одним из условий было выполнение в цикле каких-либо действий. Во первых пустой цикл используется очень редко. Во вторых цикл «ДляКаждого» используется для какой-либо коллекции, а значит и остальные циклы должны работать с коллекцией, чтобы тестирование проходило в одинаковых условиях.
Ну что ж, поехали. В качестве тела цикла использовалось чтение из заранее заполненного массива.
или, при использовании цикла «Для Каждого»
Тестирование проводилось на платформе 8.3.5.1231 для трех видов интерфейса (Обычное приложение, Управляемое приложение и Такси).
Результаты для 8.3.5.1231
Интерфейс
ДляПо
ДляКаждого
Пока
Если
Обычное приложение
5734,2
4680,4
7235,4
7263,0
Управляемое приложение
5962,4
4882,6
7497,4
7553,6
Такси
5937,2
4854,6
7500,8
7513,0
Числа это время в миллисекундах полученное с помощью функции ТекущаяУниверсальнаяДатаВМиллисекундах(), которую я вызывал до цикла и после его завершения. Числа дробные, потому что я использовал среднее арифметическое пяти замеров. Почему я не использовал Замер производительности? У меня не было цели замерить скорость каждой строчки кода, только скорость циклов с одинаковым результатом работы.
Казалось бы и все, но & тестировать так тестировать!
Результаты для 8.2.19.106
Интерфейс
ДляПо
ДляКаждого
Пока
Если
Обычное приложение
4411,8
3497,2
5432,0
5454,0
Управляемое приложение
4470,8
3584,8
5522,6
5541,0
В среднем платформа 8.2 на 25% быстрее, чем 8.3. Я немножко не ожидал такой разницы и решил провести тест на другой машине. Скажу только, что там 8.2 была быстрее процентов на 20.
Почему? Не знаю, дезасемблировать ядро в мои планы не входило, но в замер производительности я все же заглянул. Оказалось, что сами циклические операции в 8.3 проходят несколько быстрее, чем в 8.2. Но на строке
то есть при считывании элемента коллекции в переменную происходит значительное снижение производительность.
Для себя я сделал несколько выводов:
1. Если есть возможность использовать специализированный цикл & «Для Каждого», то лучше использовать его. Кстати, сам по себе он отрабатывает дольше чем другие циклы, но скорость доступа к элементу коллекции у него на много выше.
2. Если заранее знаешь количество итераций & используй «Для По». «Пока» отработает медленнее.
3. Если использовать цикл «Если» & другие программисты тебя явно не поймут.
В версии 8.2 и старше: приложение не работает непосредственно с локальными файлами, расположенными на компьютере. Файлы должны находиться на сервере.
Поэтому для открытия внешней обработки нужно выполнить следующую последовательность действий:
Передать файл внешней обработки на сервер
Подключить внешнюю обработку
Открыть форму внешней обработки
Чтобы передать файл на сервер, его нужно поместить во временное хранилище. Для этого сначала на клиенте, в обработчике команды открытия внешней обработки, методом глобального контекста ПоместитьФайл() мы помещаем файл из локальной файловой системы во временное хранилище.
В четвертом параметре этого метода указывается признак интерактивного режима выбора файла внешней обработки. Если этот параметр Истина, то появляется диалог выбора файла, в котором можно выбрать файл для помещения в хранилище. В нашем примере этот параметр - Ложь, а путь к файлу, данные из которого будут помещены во временное хранилище, явно задан во втором параметре метода.
При вызове метода ПоместитьФайл() первым его параметром, АдресХранилища, мы указываем пустую строку. После выполнения метода в нее будет помещен путь к файлу внешней обработки во временном хранилище. Этот путь мы используем для того, чтобы подключить внешнюю обработку.
Подключение внешней обработки выполняется на сервере методом Подключить() менеджера внешних обработок. В качестве параметра ему передается путь к файлу внешней обработки во временном хранилище - АдресХранилища. Возвращает этот метод имя подключенной внешней обработки, - ИмяОбработки, - которое мы используем для того, чтобы открыть форму этой обработки.
Для открытия формы внешней обработки используется метод глобального контекста ОткрытьФорму(), в который передается имя формы в виде следующей строки: "ВнешняяОбработка."+ ИмяОбработки +".Форма". В приведенном варианте открывается основная форма обработки.
При работе с внешними обработками нужно учитывать, что по-умолчанию они запускаются в безопасном режиме исполнения программного кода. Это значит, что некоторые возможности встроенного языка будут для них недоступны. Если есть уверенность, что внешняя обработка не содержит вредоносного кода, ее можно подключить в обычном режиме исполнения программного кода. Для этого используется третий параметр метода Подключить() менеджера внешних обработок.
Подробнее о режиме безопасного исполнения программного кода можно прочитать в документации: 1С:Предприятие 8.2. Руководство разработчика, Раздел 5.5.4.3: Объекты конфигурации - Ветвь конфигурации «Общие» - Роли и права доступа - Безопасный режим работы.
Подробнее об использовании метода ПоместитьФайл() можно прочитать в синтакс-помощнике: Глобальный контекст - Процедуры и функции работы с файлами.
Подробнее об использовании метода Подключить() можно прочитать в синтакс-помощнике: Прикладные объекты - Внешние обработки и отчеты - ВнешниеОбработкиМенеджер - Методы.
У объекта ВнешняяОбработкаОбъект, есть свойство ИспользуемоеИмяФайла, доступное в контексте сервера - может пригодиться.
Жизненный пример
Форма с деревом значений, в котором перечислены обработки из каталога на сервере:
При двойном щелчке по названию файла - происходит его программное открытие:
Разберем, как изменялся (скорее дополнялся) синтаксис текстов запросов на простом примере: Проводится документ Расходная содержащая в табличной части Товары список продаваемых товаров и количество. При проведении такого документа необходимо обеспечить контроль отрицательных остатков хранящихся в регистре накопления остатков ОстаткиТоваров.
Структура конфигурации представлена на рисунке справа:
Сформируем запрос к табличной части документа и виртуальной таблице Остатки регистра накопления. Учтем возможные дубли строк в документе, для этого произведем группирование записей.
Естественно приведенный запрос абсолютно не оптимален. С помощью вложенных запросов оптимизируем его: Произведем группирование табличной части документа до соединения с таблицей остатков, в параметры виртуальной таблицы передадим список товаров как значение условия для расчета остатков. В итоге наш запрос примет следующий вид:
Если бы в запросе необходимо было бы получить данные из остатков разных регистров то значение фильтра, а следовательно и наш второй вложенный запрос, повторялся бы во всех параметрах виртуальных таблиц, естественно что система при каждом вложенном запросе заново обращается к базе данных для получения данных.
Временные таблицы
Не помню уже с какого релиза в запросах стало можно использовать временные таблицы. Для этого используется объект «Менеджер временных таблиц». Фактически менеджер временных таблиц описывает пространство имен временных таблиц и отвечает за их создание и уничтожение в базе данных.
Сами временные таблицы действительно физически создаются в базе, соответственно следует относиться к ним осторожно, так как дисковая подсистема на сегодняшний момент самая медленная часть техники, а скорость создания и уничтожения таблиц напрямую от нее зависит.
Перепишем запрос для использования временных таблиц. Во временные таблицы поместим сгруппированную табличную часть документа и список товаров для фильтра виртуальных таблиц:
При использовании временных таблиц в тексте запроса применяют инструкцию Поместить для создания новой временной таблицы, в этом случае в результат запроса система передает не содержимое этой таблицы (см прим 1 и прим 2 в тексте выше), а количество записей помещенных во временную таблицу, по желанию можно не принимать это значение.
Также допускается использование инструкции Уничтожить в этом случае временная таблица уничтожается, в противном случае временные таблицы уничтожаются вместе с объектом менеджер временных таблиц.
В основном нашем запросе я использовал названия временных таблиц как указание на источник получения данных (им обязательно надо назначать синоним, что мы и видим в тексте). Использовать временные таблицы как источник можно не единожды, что при умелом их применении позволит и сократить текст запроса (улучшиться читабельность сложных запросов) и увеличить скорость (при использовании данных временной таблицы в нескольких местах запроса).
Пакетные запросы
Пакетные запросы логично дополняют функционал временных таблиц и дают больше возможностей при работе с запросами.
В пакетном запросе фактически можно описать несколько запросов, как связанных между собой использованием временных таблиц, так и не связанных (можно, но не понятно зачем?). В итоге можно выполнить последовательно все запросы и принять в результате либо массив с результатами исполнения каждого запроса, либо результат последнего. Для получения массива с результатами запроса применяют метод ВыполнитьПакет() объекта запрос, а для получения результата последнего запроса ВыполнитьЗапрос().
В тексте запроса, запросы пакета разделяются символом «;» (точка с запятой). Область имен виртуальных таблиц у одного пакетного запроса одна. Использование менеджера временных таблиц не требуется, но возможно если вы хотите передать временные таблицы из одного пакетного запроса в другой.
Перепишем процедуру для использования пакетных запросов:
Фактически я убрал определение объекта запрос и использование менеджера временных таблиц, объединил тексты запросов (обратите внимание на разделитель «;» между текстами). В результате текст запроса стал читабельнее (а при использовании конструктора запросов намного увеличивается удобство чтения запроса).
После выполнения запроса в переменную МассивРезультатов у нас попадет 3 элемента. Первые два будут содержать число характеризующее количество записей помещенных во временные таблицы ДокТЧ и СписокТоваров, а третий будет содержать выборку с полями Номенклатура, Док_Количество и Рег_Количество.
В переменную РезультатЗапроса попадет только выборка.
Ну вот и все что касается пакетных запросов. Очень удобный механизм и с точки зрения написания запросов и с точки зрения чтения сложных запросов.
На одном проекте - клиент попросил отображать в программе данные, которые выдаю специализированные сайта в формате RSS - Что делать !?
Писать парсер rss для 1С
Первым делом, взглянув на ссылки, подумал что - обычный XML, сейчас его разложу и быстренько загружу в базу, но:
Выяснилось что сайты имеют разные форматы ввода RSS и главное они не валидные(
таким образом, написав небольшой код, который получает ссылку, далее XMLФайл.Прочитать() на одном сайте проходил на ура (этот пример я описывал в статье: Чтение данных с сайта в формате XML и загрузка в 1С), а вот второй сайт, и третий тоже, при попытке прочитать() выдавали:
{ОбщийМодуль.РегЗадания.Модуль(79)}: Ошибка при вызове метода контекста (Прочитать)
Пока XMLФайл.Прочитать() Цикл
по причине:
Ошибка разбора XML: - [1,1]
Фатальная ошибка:
Extra content at the end of the document
SystemId url rss
решил попробовать на rss других известных сайтов - 80% из проверяемых выдавали ошибку
Пришлось написать прямой построчный парсер RSS:
Структура конфигурации
ИсточникиRSS - URL на RSS, ДанныеRSS - сюда записываются загруженные данные новостей
Код получился таким(в принципе код универсальный, но возможно что-то придется подпилить):
Формат JSON в 1С до версии 8.3.6 не реализован, но нижет я приведу примеры функций которые можно использовать для полноценной работы JSON в 1С предыдущий версий.
JSON (JavaScript Object Notation) это текстовый формат обмена данными, широко используемый в веб-приложениях. По сравнению с XML он является более лаконичным и занимает меньше места. Кроме этого все браузеры имеют встроенные средства для работы с JSON.
Необходимость работы с этим форматом на уровне платформы обусловлена не только тем, что это «модный современный» формат, который прикладные решения 1С:Предприятия сами по себе могут использовать для интеграции со сторонними приложениями. Другая причина заключается ещё и в том, что JSON активно используется в HTTP интерфейсах. А в 1С:Предприятии как раз есть такие механизмы, в которых хочется использовать этот формат. Это REST интерфейс приложения, автоматически генерируемый платформой, и HTTP-сервисы, которые вы можете создавать самостоятельно.
В платформе с версии 8.3.6:
Потоковое чтение и запись JSON:
Объекты потоковой работы - это общие объекты ЧтениеJSON и ЗаписьJSON. Они последовательно читают JSON из файла или строки, или последовательно записывают JSON в файл или строку. Таким образом, чтение и запись JSON происходят без формирования всего документа в памяти.
В качестве иллюстрации потокового чтения JSON можно привести следующий пример:
Результат такой записи:
Сериализация примитивных типов и коллекций в JSON
Вторая группа средств работы с JSON хороша тем, что избавляет вас от рутинной работы по чтению/записи каждого отдельного значения или свойства. При чтении документы JSON отображаются в фиксированный набор типов платформы: Строка, Число, Булево, Неопределено, Массив, ФиксированныйМассив, Структура, ФиксированнаяСтруктура, Соответствие, Дата. Соответственно, в обратную сторону, композиция объектов этих типов позволяет сформировать в памяти и быстро записать в файл структуру JSON. Таким образом, чтение и запись небольшого объема JSON заранее известной структуры можно производить немногими строчками кода.
Основное назначение этих средств мы видим в обмене информацией с внешними системами, чтении конфигурационных файлов в формате JSON.
Сериализацию вы можете выполнять с помощью методов глобального контекста ПрочитатьJSON() и ЗаписатьJSON(). Они работают в связке с объектами ЧтениеJSON и ЗаписьJSON.
В качестве примера десериализации JSON можно рассмотреть чтение массива из двух объектов:
Полностью автоматизировали работу с JSON и реализовали в платформе третью группу средств. Они позволяют сериализовать в JSON прикладные типы 1С:Предприятия: ссылки, объекты, наборы записей и вообще любые типы, для которых поддерживается XDTO сериализация. Конечно же, мы обеспечили и обратную операцию - десериализацию. Зачем это нужно!?
Прежде всего, и в основном, XDTO сериализацию в JSON мы рекомендуем использовать при обмене данными между двумя прикладными решениями 1С:Предприятия. По сравнению с XML формат JSON более компактный, сериализация/десериализация в/из JSON выполняется быстрее. Кроме этого мы предприняли дополнительные меры для того, чтобы сократить объём передаваемых данных.
Кроме обмена между приложениями 1С:Предприятия этот механизм можно использовать и для обмена с внешними системами, готовыми принимать типы данных 1С:Предприятия. Например, XDTO сериализацию в JSON можно использовать для организации собственного HTTP интерфейса прикладного решения. Сервис на платформе 1С:Предприятия будет формировать ответ в памяти в виде строки JSON. А затем передавать её при помощи объекта HTTPСервисОтвет. Реализованный нами механизм сериализации полностью соответствует стандарту JSON. Поэтому внешняя система не должна испытывать каких-либо трудностей с десериализацией.
Использование XDTO сериализации в JSON для других задач видится нам маловероятным. Потому что если внешняя система не готова работать с прикладными типами 1С:Предприятия, то зачем их ей передавать? А если предполагается обмениваться только примитивными типами и коллекциями, то для этой задачи хорошо подходят методы ПрочитатьJSON() и ЗаписатьJSON(). Подробнее здесь
Данный код позволяет открыть список документов с установленным отбором, также можно открыть список элементов справочника с нужным отбором
Для того, чтобы открыть форму списка с заранее установленным отбором используйте следующие способы:
Первый способ заключается в том, что при открытии формы можно задать параметр формы Отбор, и открыть форму списка с этим параметром.
Параметр Отбор представляет собой структуру. Имена элементов соответствуют именам полей, по которым производится отбор, а значения содержат значения отбора. Это параметр расширения управляемой формы динамического списка. То есть он существует у форм, основным реквизитом которых является реквизит типа ДинамическийСписок, например у форм списка и форм выбора.
Например, в следующем примере открывается список приходных накладных с отбором по полю Номер, равному 333.
Второй способ
Можно открыть форму списка без параметров:
И затем, в обработчике события формы списка приходных накладных ПриСозданииНаСервере написать код, который создает отбор в динамическом списке, являющемся основным реквизитом формы:
Преимущества данного метода в том, что ВидСравнения у отбора можно задавать не только Равно, как в первом случае, а и Больше, Меньше и т.п.
Но у такого способа есть и очень существенный недостаток: с этим отбором форма будет открываться всегда. Откуда бы ее ни вызвали. Поэтому такую форму не следует назначать основной. А если все же она основная - то перед установкой отбора необходимо предусмотреть какой-то анализ того, откуда открывается эта форма. Например, анализируя параметры формы.
Третий способ
И наконец, условие отбора можно поместить в произвольный запрос, выбирающий данные для динамического списка.
Например, нам нужно открыть список приходных накладных, в которых присутствует номенклатура, выделенная в списке номенклатуры.
Для этого в форме списка номенклатуры создадим команду и соответствующую ей кнопку Приходные накладные.
Обработчик выполнения этой команды заполним следующим образом:
В этом обработчике мы открываем форму списка приходных накладных, передавая в параметр формы ФильтрПоТовару ссылку на текущий элемент в списке номенклатуры.
Затем создадим форму списка документов ПриходнаяНакладная и создадим параметр формы ФильтрПоТовару, который мы будем использовать для открытия формы с нужным отбором.
Теперь откроем палитру свойств основного реквизита формы Список. Установим флаг ПроизвольныйЗапрос и в строке Настройка списка нажмём Открыть.
В поле Запрос введём следующий текст запроса:
В запросе мы используем параметр Товар, в который и будет передаваться ссылка на текущую строку в списке номенклатуры, содержащуюся в параметре формы списка приходных накладных ФильтрПоТовару.
Для этого в обработчике события формы списка ПриСозданииНаСервере напишем код для установки значения параметра запроса Товар:
Здесь Список.Параметры - это список параметров запроса динамического списка для реквизита Список. Значение параметра Товар устанавливается равным значению параметра формы ФильтрПоТовару.
В результате по нажатию кнопки Приходные накладные в форме списка номенклатуры мы будем получать список только тех приходных накладных, в которых присутствует номенклатура, выделенная в данный момент в списке номенклатуры.
В версии 8.2 приложение не работает непосредственно с локальными файлами, расположенными на компьютере. Файлы должны находиться на сервере.
Поэтому для открытия внешней обработки нужно выполнить следующую последовательность действий:
Передать файл внешней обработки на сервер
Подключить внешнюю обработку
Открыть форму внешней обработки
Чтобы передать файл на сервер, его нужно поместить во временное хранилище. Для этого сначала на клиенте, в обработчике команды открытия внешней обработки, методом глобального контекста ПоместитьФайл() мы помещаем файл из локальной файловой системы во временное хранилище.
В четвертом параметре этого метода указывается признак интерактивного режима выбора файла внешней обработки. Если этот параметр Истина, то появляется диалог выбора файла, в котором можно выбрать файл для помещения в хранилище. В нашем примере этот параметр - Ложь, а путь к файлу, данные из которого будут помещены во временное хранилище, явно задан во втором параметре метода.
При вызове метода ПоместитьФайл() первым его параметром, АдресХранилища, мы указываем пустую строку. После выполнения метода в нее будет помещен путь к файлу внешней обработки во временном хранилище. Этот путь мы используем для того, чтобы подключить внешнюю обработку.
Подключение внешней обработки выполняется на сервере методом Подключить() менеджера внешних обработок. В качестве параметра ему передается путь к файлу внешней обработки во временном хранилище - АдресХранилища. Возвращает этот метод имя подключенной внешней обработки, - ИмяОбработки, - которое мы используем для того, чтобы открыть форму этой обработки.
Для открытия формы внешней обработки используется метод глобального контекста ОткрытьФорму(), в который передается имя формы в виде следующей строки: "ВнешняяОбработка."+ ИмяОбработки +".Форма". В приведенном варианте открывается основная форма обработки. Можно открыть также и неосновную форму обработки - об этом рассказывается в вопросе Как получить неосновную форму обработки?.
Копировать в буфер обмена
При работе в внешними обработками нужно учитывать, что по-умолчанию они запускаются в безопасном режиме исполнения программного кода. Это значит, что некоторые возможности встроенного языка будут для них недоступны. Если есть уверенность, что внешняя обработка не содержит вредоносного кода, ее можно подключить в обычном режиме исполнения программного кода. Для этого используется третий параметр метода Подключить() менеджера внешних обработок.
При интеграции 1С с веб-сайтами всегда встает вопрос о передачи некоторых данных на веб-сервер. Будь то это передача параметров запроса для получения данных от веб-сервера в 1С или же передача данных из 1С, которые должны быть сохранены или каким-то образом обработаны на веб-сервере. Передаваться могут как простые данные в виде строк, чисел, так и целые файлы (изображения, XML-файлы и прочее). Для передачи и получения файлов и данных на веб-сервер в 1С используется объект HTTPСоединение.
Создание и инициализация HTTP соединения в 1С
Для инициализации HTTP соединения в 1С необходимо создать объект HTTPСоединение и в конструкторе указать параметры HTTP соединения.
<Сервер> (обязательный) - адрес сервера, с которым необходимо установить соединение.
<Порт> (необязательный) - порт сервера, с которым устанавливается соединение.
Значение по умолчанию зависит от защищенности соединения (80 для незащищенного и 443 для SSL-соединения).
<ИмяПользователя> (необязательный) - имя пользователя на указанном сервере.
<Пароль> (необязательный) - пароль пользователя на указанном сервере.
<Прокси> (необязательный). Тип - ИнтернетПрокси. Прокси, используемый для соединения с сервером.
<ЗащищенноеСоединение> (необязательный). Тип - Булево. Определяет используемый протокол -
http или https. По умолчанию Ложь.
Ниже приведен примеры создания HTTPСоединения с сайтом http://www.mysite.ru/.
Передача данных на веб-сервер из 1С методом GET.
Для передачи данных на веб-сервер из 1С методом GET используется процедура Получить() объекта HTTPСоединение.
<Источник> (обязательный). Тип - Строка. Адрес ресурса на сервере.
<ИмяВыходногоФайла> (обязательный). Тип - Строка. Имя файла на диске, в который
помещаются данные, полученные от сервера (ответ сервера).
<Заголовки> (необязательный). Тип - Строка. Заголовки, добавляемые к запросу на сервер.
Текстовые пары вида <Заголовок>:<Значение>, разделенные комбинацией ВК + ПС.
(подробнее о заголовках будет сказано ниже).
Рассмотрим параметры процедуры Получить() более подробно:
В качестве источника указывается строка с адресом запроса, идущая после названия домена и символа "/". Так, если необходимо отправить данные на адрес https://www.mysite.com/getusers.php, то при создании HTTP соединения в конструкторе HTTPСоединение в поле "Сервер" указывается "www.mysite.com", признак защищенного соединения устанавливается в Истина, а в процедуре Получить() в параметре Источник указывается "getUsers.php".
В поле ИмяВыходногоФайла указывает имя файла на диске, в который будут сохранены данные, полученные от сервере в результате запроса. Так, например, если сервер возвращает список пользователей в формате XML, то на диск в указанный файл будет сохранен XML файл со списком пользователей.
О заголовках более подробно будет сказано ниже.
Так же, при запросе к веб-серверу зачастую передаются дополнительные данные (параметры) для этого запроса. Параметры от адреса источника отделяются символом "?". Каждый параметр задается в формате <Имя_Параметры>=<Значение_Параметры>. Параметры от адреса источника отделяются символом "?". Сами же параметры отделяются друг от друга символом "&". В результате строка адреса источника может выглядеть следующим образом: getUsers.php?owner_id=263544&count=100.
Ниже приведен пример, поясняющий все выше сказанное.
Заголовки HTTP
Ниже приведена общая информация о HTTP заголовках из википедии.
Заголовки HTTP (англ. HTTP Headers) — это строки в HTTP-сообщении, содержащие разделённую двоеточием пару имя-значение. Формат заголовков соответствует общему формату заголовков текстовых сетевых сообщений ARPA. Заголовки должны отделяться от тела сообщения хотя бы одной пустой строкой.
Все заголовки разделяются на четыре основных группы:
General Headers (рус. Основные заголовки) — должны включаться в любое сообщение клиента и сервера.
Request Headers (рус. Заголовки запроса) — используются только в запросах клиента.
Response Headers (рус. Заголовки ответа) — только для ответов от сервера.
Entity Headers (рус. Заголовки сущности) — сопровождают каждую сущность сообщения.
Именно в таком порядке рекомендуется посылать заголовки получателю.
Более подробно о заголовках HTTP можно прочитать здесь. Так же можно ознакомится со списком заголовков HTTP.
От себя лишь добавлю, что, если это явно не указано в требованиях к отправке данных веб-серверу заголовки HTTP для метода GET можно не указывать. Для метода POST обычно нужно указать заголовки Content-Type (тип передаваемых данных, например: "Content-Type: text/html;charset=utf-8") и Content-Length (размер передаваемых данных в байтах, например: "Content-Length: 1348").
Напомню, что HTTP заголовки в 1С указываются строкой в виде текстовых пар "<Заголовок>:<Значение>", разделенных комбинацией символов ВК+ПС.
Также заголовки можно задать типом Соответствие, где в качестве ключа указывается заголовок, а в качестве значения - значение заголовка.
Ниже приведены поясняющие примеры:
Передача данных на веб-сервер из 1С методом POST.
Общие сведения.
Для передачи данных на веб-сервер из 1С методом POST используется процедура ОтправитьДляОбработки() объекта HTTPСоединение.
<Источник> (обязательный) - Имя файла-источника, который будет отправлен
на сервер для обработки.
<АдресРесурса> (обязательный). Тип - строка. Адрес ресурса на сервере,
в который посылаются данные из источника.
<ИмяВыходногФайла> (обязательный) - Имя файла на диске, в который записываются
полученные с сервера данные.
<Заголовки> (необязательный). Тип - строка. Заголовки, добавляемые к запросу на сервер.
Текстовые пары вида <Заголовок>:<Значение>, разделенные комбинацией ВК + ПС.
(подробнее о заголовках будет сказано ниже).
Рассмотрим параметры процедуры ОтправитьДляОбработки() подробнее:
В качестве источника указывается файл, содержимое которого необходимо отправить на сервер для обработки. Подробнее о формировании содержимого файла-источника будет сказано ниже.
Поле АдресРесурса аналогично полю Источник процедуры Получить(), т.е. указывается строка с адресом запроса, идущая после имени домена и символа "/".
Поле ИмяВыходногоФайла также аналогично одноименному полю процедуры Получить(), т.е. содержит имя файла, в котором будут сохранены данные, полученные от сервера в результате обработки исходных данных.
О заголовках было упомянуто выше. Напомню лишь, что для метода POST обычно указываются заголовки Content-Type и Content-Length. В качестве параметра заголовка Content-Length указывается размер файла-источника, преобразованный с помощью функции XMLСтрока().
Ниже приведен пример, поясняющий все выше сказанное.
Передача параметров методом POST.
Для передачи параметров, аналогично методу GET, можно сформировать строку параметров, записать их в текстовый файл и отправить этот файл на сервер для обработки. Ниже приведен пример аналогичный примеру отправки методом GET, но теперь те же данные отправляются методом POST.
Передача файлов методом POST.
Зачастую данные для обработки задаются не виде строки параметров разделенных "&", как в рассматриваемых выше примерах, а виде файла определенного формата, например XML или JSON. Рассмотрим пример отправки данных на веб-сервер для обработки методом POST, которые задаются в формате XML. Например, сервер может добавить ваш комментарий к материалу. В описании процедуры добавлении сказано, что данные необходимо отправлять по адресу www.mysite.com/addComment.php. Сами данные должны быть переданы в следующем виде:
где:
<ID_Пользователя> - id пользователя на сайте, от имени которого добавляется комментарий;
<ID_Материала> - id материала на сайте, к которому добавляется комментарий;
<Текст_Комментария> - текст комментария.
Предположим, что нам уже известны id пользователя и материала и они хранятся в переменных user_id и post_id. Ниже приведен пример, решающий нашу задачу.
Загрузка файлов (изображений, документов и т.п.) на веб-сервер методом POST.
Зачастую возникает необходимость загрузки файлов на веб-сервер. Это может быть, например, изображение к статье на сайте, или фотография для альбома, или архив для файлообменника. Ранее мы рассматривали передачу методом POST параметров или просто файлов. Таким же образом можно и передавать двоичные файлы. Но как быть, если файлы необходимо отправлять вместе с параметрами? Для возможности отправки файлов в этом случае используется HTTP заголовок ContentType:multipart/form-data. Следует заметить, что обычно таким способом передаются файлы через веб-браузеры. Т.е. когда на сайте вы выбираете файл и нажимаете кнопку "Загрузить", то файл передается способом описанным ниже. При таком способе сам файл также задается как переменная, т.е., например, файл передается через параметр file или image. Однако, мы не можем просто передать file=<Двоичные_Данные>. А вот как все таки передать файл мы и рассмотрим ниже.
Для возможности вместе с параметрами передавать и двоичные данные (файлы) необходимо сформировать HTTP заголовок Content-Type следующим образом:
Content-Type: multipart/form-data, boundary=<уникальные_данные>
где <уникальные_данные> - это любой набор цифр и/или символов, который будет служить для отделения значений друг от друга. Значение boundary должно быть уникальным в пределах пересылаемой информации, т.е. таких символов не должно встречаться в пересылаемых файлах и переменных.
Bounday можно сформировать, например, таким образом
Все данные отделяются друг от друга разделителем boundary. Начинать разделитель нужно с "--":
В конце данных нужно закрыть разделитель, добавили в конце разделителя "--", т.е. вид будет "--<boundary>--".
Итак, например, нам нужно передать на веб-сервер текстовый файл через параметр "text", его описание через параметр "desc" и id пользователя через параметр "uid", для которого будет загружен наш файл.
Предположим, что файл содержит следующий текст: Мороз и солнце; день чудесный!
Еще ты дремлешь, друг прелестный -
Пора, красавица, проснись:
Открой сомкнуты негой взоры
Навстречу северной Авроры,
Звездою севера явись!
Описание должно содержать "Стих А.С. Пушкина", а id пользователя равно "0123456". Тогда файл должен быть сформирован следующим образом (для упрощения предположим, что bounday мы уже сформировали и он равен "ccf8111910")
А теперь перейдем непосредственно к 1С. Пусть у нас будет форма с реквизитами "Пользователь", "Описание" и "ИмяФайла". Реализуем отправку данных, описанным выше способом
Передача текстовых файлов таким способом проблем не вызывает. Сложнее дело обстоит с файлами, содержащими двоичные данные (изображения, архивы и т.п.). Все дело в том, что в 1С просто нет методов для чтение двоичных файлов в строку. Если мы делаем обмен со своим сайтом, которые сами и разрабатывали, то можно просто преобразовать файл в строку Base64 при помощи процедуры Base64Строка(), а на стороне сервера преобразовать строку Base64 обратно.
А как же быть если мы загружаем файл на сторонний сервер, который принимает файл как есть без преобразование его в строку Base64(). В это случае можно пойти на хитрость. В 1С есть процедура ОбъединитьФайлы(), которая объединяет несколько файлов на диске в один результирующий файл
<ИменаЧастей> (обязательный). Тип - Массив. Массив имен частей файлов, которые
требуется объединить. Объединение будет происходить в порядке, в котором заданы
имена файлов в массиве.
<ИмяРезультирующегоФайла> (обязательный). Тип - Строка. Имя файла, который будет
создан в результате объединения файлов.
Т.е. мы можем сформировать текстовый файл с запросом, объединить его с файлом(-ами), которые необходимо передать на веб-сервер и передать уже файл, получившийся в результате объединения исходных файлов. Ниже демонстрируется процесс передачи двух zip архивов на сервер с дополнительными параметрами user_id и post_id.
Ну вот, вроде бы, и все, что я хотел рассказать о способах передачи файлов и данных на веб-сервер из 1С. Если что-то не понятно, что-то хотите уточнить или нашли ошибки - пишите в комментариях.
Автор: Павел
Обработка Универсальный обмен данными в формате XML (обработка универсальныйобменданнымиxml)
Обработка "Универсальный обмен данными в формате XML" предназначена для загрузки и выгрузки данных в файл из любой конфигурации, реализованной на платформе 1С:Предприятие 8.
Режим работы
При использовании управляемой формы обработка имеет два режим работы:
1. На клиенте. При использовании этого режима файлы правил и загружаемых данных передаются с клиента на сервер, а файл выгружаемых данных передается с сервера на клиент. Пути к этим файлам, находящимся на клиенте, необходимо указывать в диалоговом окне непосредственно перед выполнением действия.
2. На сервере. В этом режиме файлы не передаются на клиентн и пути к ним необходимо указывать на сервере.
Примечание: Файл внешней обработки и файлы протоколов обмена всегда должны находиться на сервере вне зависимости от режима работы.
Выгрузка данных
Для осуществления выгрузки данных необходимо указать имя файла, в который будет осуществляться выгрузка данных и выбрать файл правил обмена. Правила обмена для любых конфигураций могут быть настроены в специализированной конфигурации "Конвертация данных, редакция 2".
Для выгрузки документов и записей независимых периодических регистров сведений необходимо указать период - "Дату начала" и "Дату окончания". Результирующий файл с выгруженными данными может быть сжат.
На закладке "Правила выгрузки данных" можно выбрать те типы объектов, которые должны выгружаться, настроить отборы для выборки объектов, либо указать узел обмена данными, для которого нужно выгружать данные.
На закладке "Параметры выгрузки" можно указать дополнительные параметры выгрузки данных.
На закладке "Комментарий" можно написать произвольный текст-комментарий, включаемый в файл обмена.
Загрузка данных
Для осуществления загрузки данных необходимо указать имя файла, из которого будет осуществляться загрузка данных.
Есть возможность настроить загрузку данных в транзакции. Для этого необходимо взвести флажок "Использовать транзакции" и указать количество элементов в одной транзакции при загрузке.
"Загружать данные в режиме обмена (ОбменДанными.Загрузка = Истина)" – если флаг установлен, то загрузка объектов будет выполнятся с установленным признаком загрузки. Это означает, что при записи объектов в базу данных будут отключены все платформенные и прикладные проверки. Исключение составляют документы, которые записываются в режиме проведения или отмены проведения. Проведение и отмена проведения документа выполняется всегда без установки режима загрузки, т.е. проверки будут выполняться.
Дополнительные настройки
Закладка служит для детальной настройки выгрузки и загрузки данных.
"Режим отладки" – флаг для задания режима отладки обмена. Если этот флаг установлен, то процесс обмена данными не будет остановлен при возникновении какой-либо ошибки. Обмен завершится до конца с выводом отладочных сообщений в файл протокола обмена. Этот режим рекомендуется использовать при отладке правил обмена.
"Вывод информационных сообщений в окно сообщений" – если флаг установлен, то в окно сообщений будет выводиться протокол процесса обмена данными.
"Количество обработанных объектов для обновления статуса" – параметр служит для определения количества обработанных элементов перед изменением строки состояние загрузки/выгрузки
"Настройки выгрузки данных" – позволяют определить количество элементов обрабатываемых в одной транзакции при выгрузке данных, выгружать и обрабатывать только те объекты, на которые есть права доступа, настроить тип изменения регистрации для выгруженных объектов через планы обмена.
"Использовать оптимизированный формат для обмена данными (V8 - V8, версия обработки не ниже 2.0.18)" – оптимизированный формат сообщения обмена предполагает наличие узла "ИнформацияОТипахДанных" в заголовке сообщения, в который выгружается информация о типах данных. Это позволяет ускорить процесс загрузки данных.
"Использовать транзакции при выгрузке для планов обмена" – флаг определяет режим использования транзакций при выгрузке данных при выборке изменений на узлах планов обмена. Если флаг установлен, то выгрузка данных будет выполняться в транзакции.
"Количество элементов в транзакции" – определяет максимальное число элементов данных, которые помещаются в сообщение в рамках одной транзакции базы данных. Если значение параметра равно 0 (значение по умолчанию), то все данные помещаются в рамках одной транзакции. Такой режим является рекомендуемым, так как гарантирует согласованность данных, помещаемых в сообщение. Но при создании сообщения в многопользовательском режиме могут быть конфликты блокировок между транзакцией, в которой данные помещаются в сообщение, и транзакциями, выполняемыми другими пользователями. Для снижения вероятности возникновения таких конфликтов можно задать значение этого параметра, отличное от значения по умолчанию. Чем меньше значение параметра, тем меньше вероятность конфликта блокировок, но выше вероятность помещения в сообщение несогласованных данных.
"Выгружать объекты на которые есть права доступа" – если флаг установлен, то выборка объектов информационной базы будет выполняться с учетом прав доступа текущего пользователя программы. Это предполагает использование литерала "РАЗРЕШЕННЫЕ" в тексте запроса для выборки данных.
"Автоматически удалять недопустимые символы из строк для записи в XML" – если флаг установлен, то при записи данных в сообщение обмена недопустимые символы будут удалены. Символы проверяются на соответствие рекомендации XML 1.0.
"Изменения регистрации для узлов обмена после выгрузки" – поле определяет режим работы с регистрацией изменений данных после завершения выгрузки данных. Возможные значения:
Не удалять регистрацию – после выгрузки данных регистрация изменений на узле удалена не будет.
Полностью удалить регистрацию для узла обмена – после выгрузки данных регистрация изменений на узле будет полностью удалена.
Удалить регистрацию только для выгруженных метаданных – после выгрузки данных регистрация изменений на узле будет удалена только для объектов метаданных, которые были указаны к выгрузке.
"Протокол обмена" – позволяет настроить вывод информационных сообщений в окно сообщений, ведение и запись в отдельный файл протокола обмена.
"Имя файла, протокола обмена" – имя файла для вывода протокола процесса обмена данными.
"Протокол загрузки (для COM - соединения)" – имя файла для вывода протокола процесса обмена данными в базе-приемнике при обмене через COM-соединение. Важно: путь к файлу должен быть доступен с компьютера, на котором установлена база-приемник.
"Дописывать данные в протокол обмена" – если флаг установлен, то содержимое файла протокола обмена сохраняется, если файл протокола уже существует.
"Вывод в протокол информационных сообщений" – если флаг установлен, то в протокол обмена будут выводиться сообщения информативного характера, помимо сообщений об ошибках обмена.
"Открывать файлы протоколов обмена после выполнения операций" – если флаг установлен, то после выполнения обмена данными файлы протоколов обмена будут автоматически открыты для просмотра.
Удаление данных
Закладка нужна только для разработчиков правил обмена. Позволяет удалять из информационной базы произвольные объекты.
Отладка выгрузки и загрузки данных
Обработка позволяет совершать отладку обработчиков событий и генерировать модуль отладки из файла-правил или файла-данных.
Включение режима отладки обработчиков выгрузки производится на закладке "Выгрузка данных" установкой флажка "Режим отладки обработчиков выгрузки". Соответственно, на закладке "Загрузка данных" включение режима отладки загрузки производится установкой флажка "Режим отладки обработчиков загрузки".
После установки режима отладки обработчиков станет доступной кнопка настройки отладки. По нажатию на эту кнопку откроется окно настройки.
Настройка отладки обработчиков выполняется в четыре шага:
Шаг 1: Выбор режима отладки алгоритмов
На первом шаге необходимо определиться с режимом отладки алгоритмов:
Без отладки алгоритмов
Вызывать алгоритмы как процедуры
Подставлять код алгоритмов по месту вызова
Первый режим удобно использовать, когда мы точно знаем, что ошибка в обработчике не связана с кодом какого-либо алгоритма. В этом режиме код алгоритмов не выгружается в модуль отладки. Алгоритмы выполняются в контексте оператора "Выполнить()" и их код недоступен для отладки.
Второй режим необходимо использовать в тех случаях, когда ошибка находится в коде алгоритма. При установке этого режима алгоритмы будут выгружены как отдельные процедуры. В момент вызова алгоритма из какого-либо обработчика происходит обращение к соответствующей процедуре обработки. Этот режим удобно использовать, когда для передачи параметров в алгоритмы используется глобальная переменная "Параметры". Ограничения использования этого режима в том, что при отладке в алгоритме недоступны локальные переменные обработчика, из которого он вызывается.
Третий режим отладки используется, как и во втором случае, при отладке кода алгоритмов и в тех случаях, при которых второй режим отладки не подходит. При установке этого режима алгоритмы будут выгружены как интегрированный код в обработчиках. Т.е. взамен оператора вызова алгоритма вставляется полный код алгоритма с учетом вложенных алгоритмов. В этом режиме нет ограничений на использование локальных переменных обработчика, однако есть ограничение при отладке алгоритмов с рекурсивным вызовом.
Шаг 2: Формирование модуля отладки
На втором шаге необходимо произвести выгрузку обработчиков нажатием на кнопку "Сформировать модуль отладки выгрузки (загрузки)". Сформированные обработчики и алгоритмы будут выведены в отдельное окно для просмотра. Содержимое модуля отладки необходимо скопировать в буфер обмена нажатием на кнопку "Копировать в буфер обмена".
Шаг 3: Создание внешней обработки
На этом шаге необходимо запустить конфигуратор и создать новую внешнюю обработку. В модуль обработки необходимо вставить содержимое буфера обмена (модуль отладки) и сохранить обработку под любым именем.
Шаг 4: Подключение внешней обработки
На четвертом, завершающем шаге, надо указать имя файла внешней обработки в поле ввода. При этом программа выполняет проверку по времени создания (обновления) файла обработки. Если обработка имеет более раннюю версию, чем версия файла модуля отладки, то будет выведено предупреждение и форма настройки закрыта не будет.
Примечание: Возможность отладки глобального обработчика конвертации "После загрузки правил обмена" не поддерживается.
Параметры:
<Право> (обязательный)
Тип: Строка. Название права доступа.
<Объект метаданных> (обязательный) — Объект метаданных.
<Пользователь/Роль> (необязательный)
Тип: ПользовательИнформационнойБазы, Метаданные.Роли.Роль
Возвращаемое значение:
Тип: Булево. Истина - право доступа к объекту установлено; Ложь - в противном случае.
Описание:
Показывает установку права доступа к объекту метаданных для текущего пользователя.
Вызов метода всегда требует административных прав, если явно указан третий параметр - Пользователь/Роль, права которого проверяются. Если пользователь не указан, то проверяются права текущего пользователя, и для этого наличие административных прав не требуется.
Примечание:
Права доступа к объектам метаданных устанавливаются при конфигурировании ролей Синтаксис:
Параметры:
<Наименование права> (обязательный)
Тип: Строка. Наименование запрашиваемого на объект права, например "Read".
<Объект метаданных> (обязательный)
Объект метаданных, права на доступ к которому проверяются.
<Список полей> (обязательный)
Тип: Строка. Список полей объекта базы данных, права на доступ к которым проверяются. Поля указываются списком, через запятую. Могут присутствовать имена табличных частей, реквизитов табличных частей, в последнем случае поле описывается как <Имя табличной части>.<Имя реквизита табличной части>.
<Пользователь/Роль> (необязательный)
Тип: ПользовательИнформационнойБазы, Метаданные.Роли.Роль. Указывает пользователя или роль, для которых нужно определить доступность права. При этом возвращается значение права так, как оно определено в конфигурации.
Возвращаемое значение:
Тип: ПараметрыДоступа.
Описание:
Позволяет получить права текущего пользователя на заданный объект метаданных с указанием полей.
Для того чтобы прочитать файлы из ZIP-архива необходимо выполнить несколько простых действий:
- Открыть необходимый архив
- Распаковать файлы
Создание объекта ЧтениеZIPФайла можно осуществить двумя путями - создать инициализированный объект или создав неинициализированный объект вызвать у него метод Открыть(). В обоих случаях состав параметров является одинаковым. В самом простом случае требуется указать только имя архивного файла, с которым необходимо работать.
Для открытия архива требуется указать:
Имя файла, который требуется открыть. Этот параметр является обязательным.
Пароль доступа к архиву.
После того, как архив успешно открыт, можно получить информацию о файлах, хранящихся внутри него. Для этого у объекта ЧтениеZIPФайла предусмотрено свойство Элементы, которое предоставляет доступ к коллекции элементов ZIP файла.
Для каждого элемента можно получить разнообразную информацию о его имени, времени его модификации, его атрибутах, а также узнать является ли данный элемент зашифрованным.
После получения информации о элементах их можно распаковать на диск. Это возможно сделать двумя методами:
Воспользоваться методом ИзвлечьВсе().
Воспользоваться методом Извлечь().
Метод ИзвлечьВсе() распаковывает все файлы в архиву по указанному пути. Второй параметр данного метода определяет возможность восстановления исходных путей файлов.
Метод Извлечь() распаковывает указанный элемент коллекции из свойства Элементы по указанному пути. Второй параметр данного метода аналогичен тому же параметру метода ИзвлечьВсе(). Наибольший интерес представляет третий параметр данного метода - Пароль. В нем можно указать индивидуальный пароль для элемента архива, в случае если он зашифрован паролем отличным от других файлов.
После того, как архив нам больше не нужен можно завершить работу с ним вызвав метод Закрыть().
Пакетные запросы логично дополняют функционал временных таблиц и дают больше возможностей при работе с запросами.
В пакетном запросе фактически можно описать несколько запросов, как связанных между собой использованием временных таблиц, так и не связанных (можно, но не понятно зачем?). В итоге можно выполнить последовательно все запросы и принять в результате либо массив с результатами исполнения каждого запроса, либо результат последнего. Для получения массива с результатами запроса применяют метод ВыполнитьПакет() объекта запрос, а для получения результата последнего запроса ВыполнитьЗапрос().
В тексте запроса, запросы пакета разделяются символом «;» (точка с запятой). Область имен виртуальных таблиц у одного пакетного запроса одна. Использование менеджера временных таблиц не требуется, но возможно если вы хотите передать временные таблицы из одного пакетного запроса в другой.
Фактически я убрал определение объекта запрос и использование менеджера временных таблиц, объединил тексты запросов (обратите внимание на разделитель «;» между текстами). В результате текст запроса стал читабельнее (а при использовании конструктора запросов намного увеличивается удобство чтения запроса).
После выполнения запроса в переменную МассивРезультатов у нас попадет 3 элемента. Первые два будут содержать число характеризующее количество записей помещенных во временные таблицы ДокТЧ и СписокТоваров, а третий будет содержать выборку с полями Номенклатура, Док_Количество и Рег_Количество.
В переменную РезультатЗапроса попадет только выборка.
Ну вот и все что касается пакетных запросов. Очень удобный механизм и с точки зрения написания запросов и с точки зрения чтения сложных запросов.
Задача состояла в том, что нужно было из реквизита документа Сответствие выделить две строки и сделать сортировку по ним. Соответствие счета, такого вида: 779000/004599. Как разбить это значение на два?
У функции ПОДСТРОКА три параметра. В качестве первого указывается исходная строка, из которой требуется выделить часть символов — подстроку. Понятно, что тип значения этого параметра — это Строка. Внимание, это очень важное замечание, если использовать тип первого параметра не строку, функция не будет работать, запрос будет выдавать ошибку! Второй параметр определяет позицию символа в исходной строке, с которого начинается выделение части строки, а третий — это длина выделяемой подстроки. Тип значения для второго и третьего параметров — число.
Перейдём к практике:
Результат этого запроса следующий:
Название СчетЗатрат Отдел Март
Платежное поручение исходящее 00000000319 от 01.03.2010 14:42:54 779000 004599 9 000
Платежное поручение исходящее 00000000320 от 02.03.2010 12:07:34 779000 004599 4 721,6
Платежное поручение исходящее 00000000203 от 01.03.2010 12:28:52 786500 004599 987 614,51
Платежное поручение исходящее 00000000227 от 03.03.2010 14:16:00 786500 004599 400 000
Платежное поручение исходящее 00000000238 от 05.03.2010 12:37:57 732000 004600 5 400
Платежное поручение исходящее 00000000197 от 01.03.2010 11:53:11 732500 004600 12 100
Платежное поручение исходящее 00000000198 от 01.03.2010 11:55:39 732500 004600 12 100
Платежное поручение исходящее 00000000279 от 26.03.2010 0:00:00 734100 004600 19 609
Платежное поручение исходящее 00000000287 от 29.03.2010 14:15:36 734100 004600 55 300
Платежное поручение исходящее 00000000291 от 30.03.2010 11:01:10 734100 004600 18 090
Платежное поручение исходящее 00000000268 от 18.03.2010 10:34:25 738000 004600 10 050
Платежное поручение исходящее 00000000276 от 18.03.2010 12:20:20 750400 004600 13 060,98
Платежное поручение исходящее 00000000281 от 29.03.2010 12:33:46 750400 004600 555 645,41
Платежное поручение исходящее 00000000234 от 04.03.2010 12:21:55 754450 004600 24 120
Платежное поручение исходящее 00000000290 от 30.03.2010 10:44:39 754450 004600 100 000
Платежное поручение исходящее 00000000240 от 09.03.2010 10:53:24 786300 004600 20 800
Платежное поручение исходящее 00000000269 от 18.03.2010 10:58:04 786300 004600 61 012
Платежное поручение исходящее 00000000289 от 30.03.2010 9:27:14 786300 004600 6 000
Платежное поручение исходящее 00000000223 от 03.03.2010 12:13:38 786500 004600 36 000
Платежное поручение исходящее 00000000228 от 04.03.2010 9:52:35 786500 004600 378 138,85
Платежное поручение исходящее 00000000229 от 04.03.2010 9:57:50 786503 004600 126 117,75
Платежное поручение исходящее 00000000200 от 01.03.2010 11:58:06 754422 004762 63 000
Платежное поручение исходящее 00000000286 от 29.03.2010 14:10:18 764422 004762 10 000
Платежное поручение исходящее 00000000267 от 17.03.2010 0:00:00 764423 004762 464 370
Платежное поручение исходящее 00000000261 от 15.03.2010 11:16:28 764522 004762 81 357
Итак, если мы берём строку 779000/004599, то ПОДСТРОКА(Типовой.Регистратор.Соотв.Наименование, 1, 6) будет выделять строку "779000". А ПОДСТРОКА(Типовой.Регистратор.Соотв.Наименование, 8, 11) будет выводить "004599".
В этом же запросе, используется выражение:
В этой же задаче необходимо было добавить новые колонки с названиями месяцев и с суммами по ним. Как раз это выражение решает эту задачу. Если Вам нужно использовать другие месяца, например январь, то заменим выражение:
Приведу пример текста запроса, в котором с помощью цикла формируются поля месяцев (выделено жирным), начиная с марта по февраль.
Для удобства работы с параметрами типа дата, в системе компоновки данных существует возможность использовать Стандартные периоды.
Как же их использовать?
Мы имеем отчет, в котором 2 параметра: Начало периода и Конец периода. Добавим в параметры третий параметр, назовем его Стандартный период и установим ему тип СтандартныйПериод.
Для параметров Начало периода и Конец периода в Выражение запишем следующее: &СтандартныйПериод.ДатаНачала
&СтандартныйПериод.ДатаОкончания
Также у этих параметров установим галку Ограничение доступности.
Все. Теперь можно пользоваться возможностями стандартного периода:
Кроме того, стандартная дата окончания содержит время 23:59:59 что избавляет от проблемы, когда в отчет не попадают данные за последний день! also
При обходе результата запроса нередко возникает необходимость получения всех значений группировок внутри какой-либо другой группировки. Такая возможность может понадобиться, например, при выводе кросс отчета. Для обеспечения такой возможности в объекте ВыборкаИзРезультатаЗапроса предусмотрен третий параметр функции Выбрать().
Рассмотрим пример. Пусть нам необходимо получить кросс-отчет по остаткам номенклатуры на различных складах. Номенклатуру необходимо вывести в строках, склады - в колонках. Запрос для получения остатков будет выглядеть так:
Для обхода номенклатуры воспользуемся выборкой из результата запроса:
Для обхода внутри номенклатуры всех складов, присутствующих в результате запроса, получим вложенную выборку от выборки номенклатуры, с указанием третьего параметра "ВСЕ":
В случае если необходимо построить несколько отдельных кросс-таблиц для каждого значения некой группировки, необходимо в качестве третьего параметра выборки указать имя группировки, внутри которой необходимо получить все значения, вошедшие в запрос.
Пример:
В данном примере будут получены все значения складов, присутствующие в ранее выбранной организации.