Карманов простые логические выражения в 1с. Логические операции (1с предприятие). Описание конструкций языка запросов

Язык запросов в 1С 8 — это упрощенный аналог широко известного «структурированного языка программирования» (как чаще его называют, SQL). Но в 1С он используется только для чтения данных, для изменения данных применяется объектная модель данных.

Еще одно интересное отличие – русский синтаксис. Хотя на самом деле Вы можете использовать и англоязычные конструкции.

Пример запроса:

ВЫБРАТЬ
Банки.Наименование,
Банки.КоррСчет
ИЗ
Справочник.Банки КАК Банки

Данный запрос позволит увидеть нам информацию о наименовании и корреспондентском счете всех существующих в базе данных банков.

Язык запросов – самой простой и эффективный способ получения информации. Как видно из примера выше, в языке запросов нужно апеллировать именами метаданных ( – это список объектов системы, из которых состоит конфигурация, т.е справочники, документы, регистры и т.д.).

Описание конструкций языка запросов

Структура запросов

Для получения данных достаточно использовать конструкции «ВЫБРАТЬ» (select) и «ИЗ» (from). Простейший запрос выглядит следующим образом:

ВЫБРАТЬ * ИЗ Справочники.Номенклатура

Где «*» означает выбор всех полей таблицы, а Справочники.Номенклатура – имя таблицы в базе данных.

Рассмотрим более сложный и общий пример:

ВЫБРАТЬ
<ИмяПоля1> КАК <ПредставлениеПоля1>,
Сумма(<ИмяПоля2>) КАК <ПредставлениеПоля2>
ИЗ
<ИмяТаблицы1> КАК <ПредставлениеТаблицы1>
<ТипСоединения> СОЕДИНЕНИЕ <ИмяТаблицы2> КАК <ПредставлениеТаблицы2>
ПО <УсловиеСоединениеТаблиц>

ГДЕ
<УсловиеОтбораДанных>

СГРУППИРОВАТЬ ПО
<ИмяПоля1>

УПОРЯДОЧИТЬ ПО
<ИмяПоля1>

ИТОГИ
<ИмяПоля2>
ПО
<ИмяПоля1>

В данном запросе мы выбираем данные полей «ИмяПоля1» и «ИмяПоля1» из таблиц «ИмяТаблицы1» и «ИмяТаблицы», присваиваем полям синонимы с помощью оператора «КАК», соединяем их по некому условию «УсловиеСоединениеТаблиц».

Из полученных данных мы отбираем только данные, соответствующие условию из «ГДЕ» «УсловиеОтбораДанных».Далее мы группируем запрос по полю «ИмяПоля1», при этом суммируя «ИмяПоля2».Создаём итоги по полю «ИмяПоля1» и итоговым полем «ИмяПоля2».

Последним действием мы сортируем запрос с помощью конструкции «УПОРЯДОЧИТЬ ПО».

Общие конструкции

Рассмотрим общие конструкции языка запросов 1С 8.2.

ПЕРВЫЕ n

С помощью данного оператора можно получить n количество первых записей. Порядок записей определяется порядком в запросе.

ВЫБРАТЬ ПЕРВЫЕ 100
Банки.Наименование,
Банки.Код КАК БИК
ИЗ
Справочник.Банки КАК Банки
УПОРЯДОЧИТЬ ПО
Банки.Наименование

Запросом будет получено первых 100 записей справочника «Банки», упорядоченных по алфавиту.

РАЗРЕШЕННЫЕ

Эта конструкция актуальна для работы с механизмом . Суть механизма в ограничении чтения (и других действий) пользователям для конкретных записей в таблице базы данных, а не таблицы в целом.

Если пользователь пытается с помощью запроса прочитать записи недоступные ему, он получит сообщение об ошибке. Чтобы этого избежать, следует использовать конструкцию «РАЗРЕШЕННЫЕ», т.е запрос будет читать только разрешенные ему записи.

ВЫБРАТЬ РАЗРЕШЕННЫЕ
ХранилищеДополнительнойИнформации.Ссылка
ИЗ
Справочник.ХранилищеДополнительнойИнформации

РАЗЛИЧНЫЕ

Использование «РАЗЛИЧНЫЕ» позволит исключить попадание строк-дублей в результат запроса 1С. Дублирование означает совпадение всех полей запроса.

ВЫБРАТЬ ПЕРВЫЕ 100
Банки.Наименование,
Банки.Код КАК БИК
ИЗ
Справочник.Банки КАК Банки

ПустаяТаблица

Данная конструкция используется очень редко для объединения запросов. При объединении может возникнуть необходимость указать в одной из таблиц пустую вложенную таблицу. Для этого как раз подойдет оператор «ПустаяТаблица»

Пример из справки 1С 8:

ВЫБРАТЬ Ссылка.Номер, ПУСТАЯТАБЛИЦА.(Ном, Тов, Кол) КАК Состав
ИЗ Документ.РасхНакл
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ Ссылка.Номер, Состав.(НомерСтроки, Товар, Количество)
ИЗ Документ.РасхНакл Документ.РасходнаяНакладная.Состав.*

ЕСТЬNULL

Очень полезная функция, которая позволяет избежать многих ошибок. ЕстьNULL() позволяет заменить значение NULL на нужное. Очень часто используется в проверках на наличие значения в присоединенных таблицах, например:

ВЫБРАТЬ
НоменклатураСпр.Ссылка,
ЕстьNULL(ОстаткиТовара.КоличествоОстаток,0) КАК КоличествоОстаток
ИЗ


Можно использовать и по-другому. Например, если для каждой строки не известно, в какой таблице существует значение:

ЕСТЬNULL(СчетФактураПолученный.Дата, СчетФактураВыданный.Дата)

КАК – оператор, который позволяет нам присвоить имя (синоним) таблицы или полю. Пример использования мы видели выше.

Данные конструкции очень похожи – они позволяют получить строковое представление нужного значения. Единственное отличие в том, что ПРЕДСТАВЛЕНИЕ преобразует любые значения в строковый тип, а ПРЕДСТАВЛЕНИЕССЫЛКИ — только ссылочные. ПРЕДСТАВЛЕНИЕССЫЛКИ рекомендуется применять в запросах системы компоновки данных для оптимизации, если, конечно, поле ссылочных данных не планируется использовать в отборах .

ВЫБРАТЬ
Представление(Ссылка), //строка, например «Авансовый отчет №123 от 10.10.2015
Представление(ПометкаУдаления) КАК ПометкаУдаленияТекст, //строка, «Да» или «Нет»
ПредставлениеСсылки(ПометкаУдаления) КАК ПометкаУдаленияБулево //булево, Истина или Ложь
ИЗ
Документ.АвансовыйОтчет

ВЫРАЗИТЬ

Выразить позволяет преобразовать значения поля к нужному типу данных. Можно преобразовать значение как к примитивному типу, так и к ссылочному типу.

Выразить для ссылочного типа используется для ограничения запрашиваемых типов данных в полях составного типа, часто используется для оптимизации работы системы. Пример:

ВЫРАЗИТЬ(ТаблицаЗатрат.Субконто1 КАК Справочник.СтатьиЗатрат).ВидДеятельностиДляНалоговогоУчетаЗатрат

Для примитивных типов эта функция часто используется для ограничения количества символов в полях неограниченной длины (с такими полями нельзя сравнивать). Чтобы избежать ошибки «Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов
», необходимо выразить такие поля следующим образом:

ВЫРАЗИТЬ(Комментарий КАК Строка(150))

РАЗНОСТЬДАТ

Получите 267 видеоуроков по 1С бесплатно:

Пример использования ЕСТЬ NULL в запросе 1С:

ВЫБРАТЬ * ИЗ
Спр
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ОстаткиТовара
ПО НоменклатураСпр.Ссылка = РеализованныеТоварыКомитентовОстатки.Номенклатура
ГДЕ НЕ ОстаткиТовара.КоличествоОстаток ЕСТЬ NULL

Тип данных в запросе можно определить следующим образом: с помощью функций ТИП() и ТИПЗНАЧЕНИЯ() или с помощью логического оператора ССЫЛКА. Эти две функции аналогичны.

Предопределенные значения

Помимо использования в запросах переданных параметров в языке запросов 1С можно использовать предопределенные значения или . Например, перечисления, предопределенные справочники, планы счетов и так далее.Для этого используется конструкция «Значение()».

Пример использования:

ГДЕ Номенклатура.ВидНоменклатуры = Значение(Справочник.ВидыНоменклатуры.Товар)

ГДЕ Контрагенты.ВидКонтактнойИнформации = Значение(Перечисление.ВидыКонтактнойИнформации.Телефон)

ГДЕ ОстаткиПоСчетам.СчетУчета = Значение(ПланСчетов.Хозрасчетный.ПрибылиУбытки)

Соединения

Соединения бывают 4 типов: ЛЕВОЕ , ПРАВОЕ , ПОЛНОЕ, ВНУТРЕННЕЕ .

ЛЕВОЕ и ПРАВОЕ СОЕДИНЕНИЕ

Соединения используются для связи двух таблиц по определенному условию. Особенность при ЛЕВОМ СОЕДИНЕНИИ в том, что мы берём первую указанную таблицу полностью и привязываем по условию вторую таблицу. Поля второй таблицы, которые не удалось привязать по условию, заполняются значением NULL .

Например:

Вернет всю таблицу Контрагентов и заполнит поле “Банк” лишь в тех местах, где будет соблюдаться условие “Контрагенты.Наименование = Банки.Наименование”. Если условие не соблюдается, в поле Банк будет установлено NULL .

ПРАВОЕ СОЕДИНЕНИЕ в языке 1С абсолютно аналогично ЛЕВОМУ соединению , за исключением одного отличия – в ПРАВОМ СОЕДИНЕНИИ “главная” таблица – вторая, а не первая.

ПОЛНОЕ СОЕДИНЕНИЕ

ПОЛНОЕ СОЕДИНЕНИЕ отличается от левого и правого тем, что выводит все записи из двух таблиц, соединяет лишь те, которые может соединить по условию.

Например:

ИЗ

ПОЛНОЕ СОЕДИНЕНИЕ
Справочник.Банки КАК Банки

ПО

Язык запросов вернет обе таблицы полностью лишь по выполненному условию соединить записи. В отличие от левого/правого соединения возможно появления NULL в двух полях.

ВНУТРЕННЕЕ СОЕДИНЕНИЕ

ВНУТРЕННЕЕ СОЕДИНЕНИЕ отличается от полного тем, что выводит только те записи, которые смогли соединить по заданному условию.

Например:

ИЗ
Справочник.Контрагенты КАК Клиенты

ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Справочник.Банки КАК Банки

ПО
Клиенты.Наименование = Банки.Наименование

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

Объединения

Конструкция ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ объединяет два результата в один. Т.е. результат выполнения двух будет «слит» в один, общий.

Т.е система работает точно так же, как и обычные , только для временной таблицы.

Как использовать ИНДЕКСИРОВАТЬ ПО

Однако следует учесть один момент. Построение индекса временной таблицы также требует времени на выполнение. Поэтому целесообразно использовать конструкцию ” ”, только если точно известно, что во временной таблице будет не 1-2 записи. В противном случае эффект может быть обратным – быстродействие от индексированных полей не компенсирует времени построения индекса.

ВЫБРАТЬ
КурсыВалютСрезПоследних.Валюта КАК Валюта,
КурсыВалютСрезПоследних.Курс
ПОМЕСТИТЬ КурсыВалют
ИЗ
РегистрСведений.КурсыВалют.СрезПоследних(&Период,) КАК КурсыВалютСрезПоследних
ИНДЕКСИРОВАТЬ ПО
Валюта
;
ВЫБРАТЬ
ЦеныНоменклатуры.Номенклатура,
ЦеныНоменклатуры.Цена,
ЦеныНоменклатуры.Валюта,
КурсыВалют.Курс
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период,
Номенклатура В (&Номенклатура) И ТипЦен = &ТипЦен) КАК ЦеныНоменклатуры
ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК КурсыВалют
ПО ЦеныНоменклатуры.Валюта = КурсыВалют.Валюта

Группировка

Язык запросов 1С позволяет использовать специальные агрегатные функции при группировке результатов запросов. Группировку можно также использовать без агрегатных функций, для «устранения» дублей.

Существуют следующие функции:

Сумма, Количество, Количество разных, Максимум, Минимум, Среднее.

Пример №1:

ВЫБРАТЬ
РеализацияТоваровУслугТовары.Номенклатура,
СУММА(РеализацияТоваровУслугТовары.Количество) КАК Количество,
СУММА(РеализацияТоваровУслугТовары.Сумма) КАК Сумма
ИЗ

СГРУППИРОВАТЬ ПО
РеализацияТоваровУслугТовары.Номенклатура

Запрос получает все строки с товарами и суммирует их по количеству и суммам в разрезе номенклатуры.

Пример №2

ВЫБРАТЬ
Банки.Код,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Банки.Ссылка) КАК КоличествоДублей
ИЗ
Справочник.Банки КАК Банки
СГРУППИРОВАТЬ ПО
Банки.Код

Данный пример отобразит список БИКов справочника «Банки» и покажет, сколько дублей существует по каждому из них.

Итоги

Итоги – способ получения данных из системы с иерархической структурой. Для итоговых полей могут использоваться агрегатные функции, как для группировок.

Один из самых популярных способов использования итогов в практике – партионное списание товаров.

ВЫБРАТЬ




ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
УПОРЯДОЧИТЬ ПО

ИТОГИ
СУММА(Количество),
СУММА(Сумма)
ПО
Номенклатура

В результате запроса получится следующее иерархическое :

Общие итоги

Если необходимо получить итоги по всем «итогам», используйте оператор «ОБЩИЕ».

ВЫБРАТЬ
РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
РеализацияТоваровУслугТовары.Ссылка КАК Документ,
РеализацияТоваровУслугТовары.Количество КАК Количество,
РеализацияТоваровУслугТовары.Сумма КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
УПОРЯДОЧИТЬ ПО
РеализацияТоваровУслугТовары.Ссылка.Дата
ИТОГИ
СУММА(Количество),
СУММА(Сумма)
ПО
ОБЩИЕ,
Номенклатура

В результате выполнения запроса получим следующий результат:

В котором 1 уровень группировки – агрегирование всех нужных полей.

Упорядочивание

Оператор УПОРЯДОЧИТЬ ПО используется для сортировки результата запроса.

Сортировка для примитивных типов (строка, число, булево) происходит по обычным правилам. Для полей ссылочных типов сортировка происходит по внутреннему представлению ссылки (уникальный идентификатор), а не по коду или по представлению ссылки.

ВЫБРАТЬ

ИЗ
Справочник.Номенклатура КАК Номенклатура
УПОРЯДОЧИТЬ ПО
Наименование

Запрос выведет список наименований справочника номенклатуры, отсортированного по алфавиту.

Автоупорядочивание

Результат запроса без сортировки представляет собой хаотично представленный набор строк. Разработчики платформы 1С не гарантируют вывод строк в одинаковой последовательности при выполнении одинаковых запросов.

Если необходимо выводить записи таблицы в постоянном порядке, необходимо использовать конструкцию «Автоупорядочивание».

ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
АВТОУПОРЯДОЧИВАНИЕ

Виртуальные таблицы

Виртуальные таблицы в 1С – это уникальная особенность языка запросов 1С, которой нет в других аналогичных синтаксисах. Виртуальная таблица – быстрый способ получения профильной информации из регистров.

Для каждого из типов регистров свой набор виртуальных таблиц, который может отличаться в зависимости от настроек регистра.

  • срез первых;
  • срез последних.
  • остатки;
  • обороты;
  • остатки и обороты.
  • движения с субконто;
  • обороты;
  • обороты Дт Кт;
  • остатки;
  • остатки и обороты
  • субконто.
  • база;
  • данные графика;
  • фактический период действия.

Для разработчика решения данные берутся из одной (виртуальной) таблицы, но на самом деле платформа 1С берёт из множества таблиц, преобразуя их в нужных вид.

ВЫБРАТЬ
ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток,
ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот,
ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход,
ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход,
ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты КАК ТоварыНаСкладахОстаткиИОбороты

Такой запрос позволяет быстро получить большое количество данных.

Параметры виртуальных таблиц

Очень важный аспект работы с виртуальными таблицами – использование параметров. Параметры виртуальных таблиц – специализированные параметры для отбора и настройки.

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

Пример использования таких параметров:

РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Месяц, ДвиженияИГраницыПериода, Номенклатура = &НужнаяНоменклатура)

Алгоритм работы виртуальных таблиц

Например, наиболее используемая виртуальная таблица типа «Остатки» хранит данные двух физических таблиц – остатков и движений.

При использовании виртуальной таблицы система проделывает следующие манипуляции:

  1. Получаем ближайшее по дате и измерениям рассчитанное значение в таблице итогов.
  2. «Прибавляем» сумму из таблицы движения к сумме из таблицы итогов.


Такие простые действия могут существенно повысить производительность системы в целом.

Использование конструктора запросов

Конструктор запросов – инструмент, встроенный в систему 1С предприятие, существенно облегчающий разработку запросов к базе данных.

Конструктор запроса имеет достаточно простой, интуитивно понятный интерфейс. Тем не менее рассмотрим применение конструктора запроса подробнее.

Запуск конструктора текста запроса производится контекстным меню (правой кнопкой мыши) в нужном месте программного кода.

Описание конструктора запроса 1С

Рассмотрим каждую вкладку конструктора подробнее. Исключение – вкладка Построитель, это тема для отдельного разговора.

Вкладка Таблицы и поля

На этой вкладке указывается источник данных и поля, которые необходимо выводить в отчет. По сути тут описываются конструкции ВЫБРАТЬ.. ИЗ.

В качестве источника может служить физическая таблица базы данных, виртуальная таблица регистров, временные таблицы, вложенные запросы и т.д.

В контекстном меню виртуальных таблиц можно задать параметры виртуальной таблицы:

Вкладка Связи

Вкладка служит для описания соединений нескольких таблиц, создает конструкции со словом СОЕДИНЕНИЕ.

Вкладка Группировка

На данной вкладке система позволяет группировать и суммировать нужные поля результата таблицы. Описывается использование конструкций СГРУППИРОВАТЬ ПО, СУММА, МИНИМУМ, СРЕДНЕЕ, МАКСИМУМ, КОЛИЧЕСТВО, КОЛИЧЕСТВО РАЗЛИЧНЫХ.

Вкладка Условия

Отвечает за всё, что идёт в тексте запроса после конструкции ГДЕ, т.е за все условия, накладываемые на получаемые данные.

Вкладка Дополнительно

Вкладка Дополнительно изобилует всевозможными параметрами, которые являются очень важными. Рассмотрим каждое из свойств.

Группировка Выборка записей :

  • Первые N – параметр, возвращающий в запрос только N записей (оператор ПЕРВЫЕ)
  • Без повторяющихся – обеспечивает уникальность полученных записей (оператор РАЗЛИЧНЫЕ)
  • Разрешенные – позволяет выбирать только те записи, которые позволяет выбрать система с учетом (конструкция РАЗРЕШЕННЫЕ)

Группировка Тип запроса определяет, какой будет тип запроса: выборка данных, создание временной таблицы или же уничтожение временной таблицы.

Ниже существует флаг Блокировать полученные данные для последующего изменения . Он позволяет включить возможность установки блокировки данных, которая обеспечивает сохранность данных от момента их чтения до изменения (актуально только для Автоматического режима блокировок, конструкция ДЛЯ ИЗМЕНЕНИЯ).

Вкладка Объединения/Псевдонимы

На этой вкладке конструктора запросов устанавливается возможность объединения разных таблиц и псевдонимов(конструкция КАК). В левой части указываются таблицы. Если установить флаги напротив таблицы, будет использоваться конструкция ОБЪЕДИНИТЬ, иначе – ОБЪЕДИНИТЬ ВСЕ (отличия двух способов ). В правой части указываются соответствия полей в разных таблицах, если соответствие не указано, запрос будет возвращать NULL.

Вкладка Порядок

Здесь указывается порядок сортировки значений (УПОРЯДОЧИТЬ ПО) – по убыванию (УБЫВ) или возрастанию(ВОЗР).

Также есть интересный флаг – Автоупорядочивание (в запросе – АВТОУПОРЯДОЧИВАНИЕ). По умолчанию система 1С выводит данные в “хаотичном” порядке. Если установить этот флаг, система будет сортировать данные по внутренним данным.

Вкладка Пакет запросов

На вкладке конструктора запросов можно создавать новые , а также использовать её в роли навигации. В тексте запроса пакеты разделяются символом “;”(точка запятая).

Кнопка “Запрос” в конструкторе запросов

В левом нижнем углу конструктора запроса есть кнопка Запрос, с помощью которого можно в любой момент просмотреть текст запроса:

В данном окне можно внести коррективы в запрос и выполнить его.


Использование консоли запросов

Консоль запросов – простой и удобный способ для отладки сложных запросов и быстрого получения информации. В этой статье я постараюсь описать, как пользоваться консолью запросов, и дам ссылку для скачивания консоли запросов.

Рассмотрим этот инструмент подробнее.

Скачать консоль запросов 1С

Первым делом, чтобы начать работу с консолью запросов, её нужно откуда-то скачать. Обработки обычно делятся на два вида – на управляемых формах и обычных (или, иногда, их называют на 8.1 и на 8.2/8.3).

Я постарался объединить эти два вида в одной обработке – в нужном режиме работы открывается нужная форма (в управляемом режиме консоль работает только в толстом режиме).

Описание консоли запросов 1С

Начнем рассмотрение консоли запросов с описания главной панели обработки:

В шапке консоли запросов можно увидеть время выполнения последнего запроса с точностью до миллисекунды, это позволяет сравнивать разные конструкции по производительности.

Первая группа кнопок в командной панели отвечает за сохранение текущих запросов во внешнем файле. Это очень удобно, Вы всегда сможете вернуться к написанию сложного запроса. Или же, например, хранить список типичных примеров тех или иных конструкций.

Слева, в поле “Запрос”, можно создавать новые запросы и сохранять их в древовидной структуре. Вторая группа кнопок как раз отвечает за управление списком запросов. С помощью неё можно создать, скопировать, удалить, переместить запрос.

  • Выполнить запрос – простое выполнение и получение результата
  • Выполнить пакет – позволяет просмотреть все промежуточные запросы в пакете запросов
  • Просмотр временных таблиц – позволяет увидеть результаты, которые возвращают временные запросы в таблице

Параметры запроса:

Позволяют установить текущие параметры для запроса.

В окне параметров запроса интересно следующее:

  • Кнопка Получить из запроса автоматически находит все параметры в запросе для удобства разработчика.
  • Флаг Единые параметры для всех запросов – при установке его обработка не очищает параметры при переходе от запроса к запросу в общем списке запросов.

Задать параметр списком значений очень просто, достаточно при выборе значения параметра нажать на кнопку очистки значения (крестик), система предложит выбрать тип данных, где надо выбрать “Список значения”:

Также в верхней панели очень есть кнопка вызова настроек консоли запросов:

Здесь можно указать параметры автосохранения запросов и параметры выполнения запроса.

В поле запроса консоли заносится текст запроса. Сделать это можно простым набором теста запроса или же вызовом специального инструмента – конструктора запросов.

Конструктор запроса 1С 8 вызывается из контекстного меню (правая кнопка мыши) при нажатии на поле ввода:

Также в этом меню есть такие полезные функции, как очистка или добавление в запрос символов переноса строки (“|”) или же получения кода запроса вот в таком удобном виде:

Запрос = Новый Запрос;
Запрос.Текст = ”
|ВЫБРАТЬ
| Валюты.Ссылка
|ИЗ
| Справочник.Валюты КАК Валюты”;
РезультатЗапроса = Запрос.Выполнить();

В нижнем поле консоли запросов отображается поле результата запроса, ради чего и создана эта обработка:



Также консоль запросов кроме списка умеет отображать данные в виде дерева — для запросов, содержащих итоги.

Оптимизация запросов

Одним из важнейших пунктов в повышении производительности работы 1С предприятия 8.3 является оптимизация запросов . Этот пункт также очень важен при сдаче аттестации . Ниже пойдет речь о типичных причинах не оптимальной работы запросов и способах из оптимизации.

Отборы в виртуальной таблице с помощью конструкции ГДЕ

Накладывать фильтры на реквизиты виртуальной таблицы необходимо только через параметры ВТ. Ни в коем случае для отбора в виртуальной таблице нельзя использовать конструкцию ГДЕ, это грубейшая ошибка с точки зрения оптимизации. В случае с отбором с помощью ГДЕ по факту система получит ВСЕ записи и только потом отберет нужные.

ПРАВИЛЬНО :

ВЫБРАТЬ

ИЗ
РегистрНакопления.ВзаиморасчетыСДепонентамиОрганизаций.Остатки(
,
Организация = &Организация
И Физлицо = &Физлицо) КАК ВзаиморасчетыСДепонентамиОрганизацийОстатки

НЕПРАВИЛЬНО :

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

Получение значения поля составного типа через точку

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

Например, крайне нежелательно для оптимизации обращаться к полю записи регистра – регистратор. Регистратор имеет составной тип данных, среди которых все возможные типы документов, которые могут писать данные в регистр.

НЕПРАВИЛЬНО:

ВЫБРАТЬ
НаборЗаписей.Регистратор.Дата,
НаборЗаписей.Количество
ИЗ
РегистрНакопления.ТоварыОрганизации КАК НаборЗаписей

Т.е по факту вот такой запрос будет обращаться не к одной таблице, а к 22 таблицам базы данных (у этого регистра 21 тип регистратора).

ПРАВИЛЬНО:

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

Либо второй вариант – добавление такой информации в реквизит, например, в нашем случае – добавление даты.

ПРАВИЛЬНО:

ВЫБРАТЬ
ТоварыОрганизаций.Дата,
ТоварыОрганизаций.Количество
ИЗ
РегистрНакопления.ТоварыОрганизаций КАК ТоварыОрганизаций

Подзапросы в условии соединения

Для оптимизации недопустимо использовать подзапросы в условиях соединения, это существенно замедляет работу запроса. Желательно в таких случаях использовать ВТ. Для соединения нужно использовать только объекты метаданных и ВТ, предварительно проиндексировав их по полям соединения.

НЕПРАВИЛЬНО:

ВЫБРАТЬ …

ЛЕВОЕ СОЕДИНЕНИЕ (
ВЫБРАТЬ ИЗ РегистрСведений.Лимиты
ГДЕ …
СГРУППИРОВАТЬ ПО …
) ПО …

ПРАВИЛЬНО:

ВЫБРАТЬ …
ПОМЕСТИТЬ Лимиты
ИЗ РегистрСведений.Лимиты
ГДЕ …
СГРУППИРОВАТЬ ПО …
ИНДЕКСИРОВАТЬ ПО …;

ВЫБРАТЬ …
ИЗ Документ.РеализацияТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ Лимиты
ПО …;

Соединение записей с виртуальными таблицами

Бывают ситуации, когда при соединении виртуальной таблицы с другими система работает не оптимально. В таком случае для оптимизации работы запроса можно попробовать поместить виртуальную таблицу во временную, не забыв проиндексировать соединяемые поля в запросе временной таблицы. Связано это с тем, что ВТ часто содержатся в нескольких физических таблицах СУБД, в итоге для их выборки составляется подзапрос, и проблема получается аналогичной предыдущему пункту.

Использование отборов по не индексируемым полям

Одна из самых распространенных ошибок при составления запросов – использование условий по не индексируемым полям, это противоречитправилам оптимизации запросов. СУБД не может выполнить запрос оптимально, если в запросе накладывается отбор по неиндексируемым полям. Если же берется временная таблица – также необходимо индексировать поля соединения.

Обязательно для каждого условия должен существовать подходящий индекс. Подходящим является индекс, удовлетворяющий следующим требованиям:

  1. Индекс содержит все поля, перечисленные в условии.
  2. Эти поля находятся в самом начале индекса.
  3. Эти отборы идут подряд, то есть между ними не «вклиниваются» значения, не участвующие в условии запроса.

Если СУБД не подобрал правильные индексы, то будет просканирована таблица полностью – это очень негативно скажется на производительности и может привести к продолжительной блокировке всего набора записей.

Использование логического ИЛИ в условиях

Вот и всё, в данной статье были освещены основы аспекты оптимизации запросов, которые должен знать каждый эксперт 1С.

Очень полезный бесплатный видеокурс по разработке и оптимизации запросов, категорически рекомендую новичкам и не только!

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Система компоновки данных _ Язык выражений системы компоновки данных

Содержание
1 Язык выражений системы компоновки данных
2 Литералы
2.1 Строка
2.2 Число
2.3 Дата
2.4 Булево
2.5 Значение
3 Операции над числами
3.1 Унарный –
3.2 Унарный +
3.3 Бинарный -
3.4 Бинарный +
3.5 Произведение
3.6 Деление
3.7 Остаток от деления
4 Операции над строками
4.1 Конкатенация (Бинарный +)
4.2 Подобно
5 Операции сравнения
5.1 Равно
5.2 Не равно
5.3 Меньше
5.4 Больше
5.5 Меньше или равно
5.6 Больше или равно
5.7 Операция В
5.8 Операция проверки наличия значения в наборе данных
5.9 Операция проверки значения на NULL
5.10 Операция проверки значения на неравенство NULL
6 Логические операции
6.1 Операция НЕ
6.2 Операция И
6.3 Операция ИЛИ
7 Агрегатные функции
7.1 Сумма
7.2 Количество
7.3 Количество различных
7.4 Максимум
7.5 Минимум
7.6 Среднее
8 Другие операции
8.1 Операция ВЫБОР
9 Правила сравнения двух значений
10 Работа со значением NULL
11 Приоритеты операций
12 Функции языка выражений системы компоновки данных
12.1 Вычислить
12.2 Уровень
12.3 НомерПоПорядку
12.4 НомерПоПорядкуВГруппировке
12.5 Формат
12.6 НачалоПериода
12.7 КонецПериода
12.8 ДобавитьКДате
12.9 РазностьДат
12.10 Подстрока
12.11 ДлинаСтроки
12.12 Год
12.13 Квартал
12.14 Месяц
12.15 ДеньГода
12.16 День
12.17 Неделя
12.18 ДеньНедели
12.19 Час
12.20 Минута
12.21 Секунда
12.22 Выразить
12.23 ЕстьNull
12.24 Функции общих модулей

Язык выражений системы компоновки данных

Язык выражений системы компоновки данных предназначен для записи выражений, используемых в различных частях системы.

Выражения используются в следующих подсистемах:

  • схема компоновки данных - для описания вычисляемых полей, полей итогов, выражений связи и т.д.;
  • настройки компоновки данных - для описания выражений пользовательских полей;
  • макет компоновки данных - для описания выражений связи наборов данных, описания параметров макета и т.д.

Литералы

В выражении могут присутствовать литералы. Возможны литералы следующих типов:

  • Строка;
  • Число;
  • Дата;
  • Булево.

Строка

Строковый литерал записывается в символах «”», например:

“Строковой литерал“


При необходимости использования внутри строкового литерала символа «”», следует использовать два таких символов.

Например:

“Литерал ““в кавычках“““

Число

Число записывается без пробелов, в десятичном формате. Дробная часть отделяется при помощи символа «.». Например:

Дата

Литерал типа дата записывается при помощи ключевого литерала ДАТАВРЕМЯ (DATETIME). После данного ключевого слова, в скобках, через запятую перечисляются год, месяц, день, часы, минуты, секунды. Указание времени не обязательно.

Например:
ДАТАВРЕМЯ(1975, 1, 06) – Шестое января 1975 года
ДАТАВРЕМЯ(2006, 12, 2, 23, 56, 57) – Второе декабря 2006 года, 23 часа 56 минут 57 секундода, 23 часа 56 минут 57 секунд

Булево

Булевы значения могут быть записаны при помощи литералов Истина (True), Ложь (False).

Значение

Для указания литералов других типов (системных перечислений, предопределенных данных) используется ключевое слово Значение, после которого в скобках идет указание имени литерала.
Значение(ВидСчета. Активный)

Операции над числами

Унарный –

Данная операция предназначена для изменения знака числа на обратный. Например:
-Продажи.Количество

Унарный +

Данная операция не выполняет над числом никаких действий. Например:
+Продажи.Количество

Бинарный -

Данная операция предназначена для вычисления разности двух чисел. Например:
ОстаткиИОбороты.НачальныйОстаток – ОстаткиИОбороты.КонечныйОстаток
ОстаткиИОбороты.НачальныйОстаток - 100
400 – 357

Бинарный +

Данная операция предназначена для вычисления суммы двух чисел. Например:
ОстаткиИОбороты.НачальныйОстаток + ОстаткиИОбороты.Оборот
ОстаткиИОбороты.НачальныйОстаток + 100
400 + 357

Произведение

Данная операция предназначена для вычисления произведения двух чисел. Например:
Номенклатура.Цена * 1.2
2 * 3.14

Деление

Данная операция предназначена для получения результата деления одного операнда на другой. Например:
Номенклатура.Цена / 1.2
2 / 3.14

Остаток от деления

Данная операция предназначена для получения остатка от деления одного операнда на другой. Например:
Номенклатура.Цена % 1.2
2 % 3.14

Операции над строками

Конкатенация (Бинарный +)

Данная операция предназначена для конкатенации двух строк. Например:
Номенклатура.Артикул + “: ”+ Номенклатура.Наименование

Подобно

Данная операция проверяет соответствие строки переданному шаблону.

Значением оператора ПОДОБНО является ИСТИНА, если значение <Выражения> удовлетворяет шаблону, и ЛОЖЬ в противном случае.

Следующие символы в <Строке_шаблона> имеют смысл, отличный от просто очередного символа строки:

  • % - процент: последовательность, содержащая ноль и более произвольных символов;
  • _ - подчеркивание: один произвольный символ;
  • […] - один или несколько символов в квадратных скобках: один символ, любой из перечисленных внутри квадратных скобок. В перечислении могут встречаться диапазоны, например a-z, означающие произвольный символ, входящий в диапазон, включая концы диапазона;
  • [^…] - в квадратных скобках значок отрицания, за которым следует один или несколько символов: любой символ, кроме тех, которые перечислены следом за значком отрицания;

Любой другой символ означает сам себя и не несет никакой дополнительной нагрузки. Если в качестве самого себя необходимо записать один из перечисленных символов, то ему должен предшествовать <Спецсимвол>, указанный после ключевого слова СПЕЦСИМВОЛ (ESCAPE).

Например, шаблон
“%АБВ[абвг]\_абв%” СПЕЦСИМВОЛ “\”

означает подстроку, состоящую из последовательности символов: буквы А; буквы Б; буквы В; одной цифры; одной из букв а, б, в или г; символа подчеркивания; буквы а; буквы б; буквы в. Причем эта последовательность может располагаться, начиная с произвольной позиции в строке.

Операции сравнения

Равно

Данная операция предназначена для сравнения двух операндов на равенство. Например:
Продажи.Контрагент = Продажи.НоменклатураОсновнойПоставщик

Не равно

Данная операция предназначена для сравнения двух операндов на неравенство. Например:
Продажи.Контрагент Продажи.НоменклатураОсновнойПоставщик

Меньше

Данная операция предназначена для проверки того, что первый операнд меньше второго. Например:
ПродажиТекщие.Сумма

Больше

Данная операция предназначена для проверки того, что первый операнд больше второго. Например:
ПродажиТекщие.Сумма > ПродажиПрошлые.Сумма

Меньше или равно

Данная операция предназначена для проверки того, что первый операнд меньше либо равен второму. Например:
ПродажиТекщие.Сумма

Больше или равно

Данная операция предназначена для проверки того, что первый операнд больше либо равен второму. Например:
ПродажиТекщие.Сумма >= ПродажиПрошлые.Сумма

Операция В

Данная операция осуществляет проверку наличия значения в переданном списке значений. Результатом операции будет Истина, в случае, если значение найдено, или Ложь - в противном случае. Например:
Номенклатура В (&Товар1, &Товар2)

Операция проверки наличия значения в наборе данных

Операция осуществляет проверку наличия значения в указанном наборе данных. Набор данных для проверки должен содержать одно поле. Например:
Продажи.Контрагент В Контрагенты

Операция проверки значения на NULL

Данная операция возвращает значение Истина в случае, если значение является значением NULL. Например:
Продажи.Контрагент ЕСТЬ NULL

Операция проверки значения на неравенство NULL

Данная операция возвращает значение Истина в случае, если значение не является значением NULL. Например:
Продажи.Контрагент ЕСТЬ НЕ NULL

Логические операции

Логические операции принимают в качестве операндов выражения, имеющие тип Булево.

Операция НЕ

Операция НЕ возвращает значение Истина в случае, если ее операнд имеет значение Ложь, и значение Ложь в случае, если ее операнд имеет значение Истина. Например:
НЕ Документ.Грузополучатель = Документ.Грузоотправитель

Операция И

Операция И возвращает значение Истина в случае, если оба операнда имеют значение Истина, и значение Ложь в случае, если один из операндов имеет значение Ложь. Например:
Документ.Грузополучатель = Документ.Грузоотправитель И Документ.Грузополучатель = &Контрагент

Операция ИЛИ

Операция ИЛИ возвращает значение Истина в случае, если один из операндов имеет значение Истина, и Ложь в случае, если оба операнда имеют значение Ложь. Например:
Документ.Грузополучатель = Документ.Грузоотправитель ИЛИ Документ.Грузополучатель = &Контрагент

Агрегатные функции

Агрегатные функции осуществляют некоторое действие над набором данных.

Сумма

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

Количество

Функция Количество рассчитывает количество значений отличных от значения NULL. Например:
Количество(Продажи.Контрагент)

Количество различных

Эта функция рассчитывает количество различных значений. Например:
Количество(Различные Продажи.Контрагент)

Максимум

Функция получает максимальное значение. Например:
Максимум(Остатки.Количество)

Минимум

Функция получает минимальное значение. Например:
Минимум(Остатки.Количество)

Среднее

Функция получает среднее значение для значений, отличных от NULL. Например:
Среднее(Остатки.Количество)

Другие операции

Операция ВЫБОР

Операция Выбор предназначена для осуществления выбора одного из нескольких значений при выполнении некоторых условий. Например:
Выбор Когда Сумма > 1000 Тогда Сумма Иначе 0 Конец

Правила сравнения двух значений

Если типы сравниваемых значений отличаются друг от друга, то отношения между значениями определяются на основании приоритета типов:
NULL (самый низший);
Булево;
Число;
Дата;
Строка;
Ссылочные типы

Отношения между различными ссылочными типами определяются на основе ссылочных номеров таблиц, соответствующих тому или иному типу.

Если типы данных совпадают, то производится сравнение значений по следующим правилам:
у типа Булево значение ИСТИНА больше значения ЛОЖЬ;
у типа Число обычные правила сравнения для чисел;
у типа Дата более ранние даты меньше более поздних;
у типа Строка - сравнения строк в соответствии с установленными национальными особенностями базы данных;
ссылочные типы сравниваются на основе своих значений (номера записи и т. п.).

Работа со значением NULL

Любая операция, в которой значение одного из операндов NULL, будет давать результат NULL.

Есть исключения:
операция И будут возвращать NULL только в случае, если ни один из операндов не имеет значение Ложь;
операция ИЛИ будет возвращать NULL только в случае, если ни один из операндов не имеет значение Истина.

Приоритеты операций

Операции имеют следующие приоритеты (первая строка имеет низший приоритет):
ИЛИ;
И;
НЕ;
В, ЕСТЬ NULL, ЕСТЬ НЕ NULL;
=, <>, <=, <, >=, >;
Бинарный +, Бинарный – ;
*, /, %;
Унарный +, Унарный -.

Функции языка выражений системы компоновки данных

Вычислить

Функция Вычислить предназначена для вычисления выражения в контексте некоторой группировки. Функция имеет следующие параметры:
Выражение. Тип Строка. Содержит вычисляемое выражение;
Группировка. Тип Строка. Содержит имя группировки, в контексте которой необходимо вычислить выражение. В случае если в качестве имени группировки используется пустая строка, вычисление будет выполнено в контексте текущей группировки. В случае если в качестве имени группировки будет использована строка ОбщийИтог, вычисление будет выполнено в контексте общего итога. В остальных случаях вычисление будет выполняться в контексте родительской группировки с таким именем. Например:
Сумма(Продажи.СуммаОборот) / Вычислить("Сумма(Продажи.СуммаОборот)", "ОбщийИтог")

В данном примере в результате получится отношение суммы по полю "Продажи.СуммаОборот" записи группировки к сумме того же поля во всей компоновке.

Уровень

Функция предназначена для получения текущего уровня записи.

Пример:
Уровень()

НомерПоПорядку

Получить следующий порядковый номер.

Пример:
НомерПоПорядку()

НомерПоПорядкуВГруппировке

Возвращает следующий порядковый номер в текущей группировке.

Пример:
НомерПоПорядкуВГруппировке()

Формат

Получить отформатированную строку переданного значения.

Форматная строка задается в соответствии с форматной строкой 1С:Предприятие.

Параметры:
Значение;
Форматная строка.

Пример:
Формат(РасходныеНакладные.СуммаДок, "ЧДЦ=2")

НачалоПериода

Параметры:

    • Минута;
    • День;
    • Неделя;
    • Месяц;
    • Квартал;
    • Декада;
    • Полугодие.

Пример:
НачалоПериода(ДатаВремя(2002, 10, 12, 10, 15, 34), "Месяц")

Результат:

01.10.2002 0:00:00

КонецПериода

Функция предназначена для выделения определенной даты из заданной даты.

Параметры:

  • Дата. Тип Дата. Заданная дата;
  • Тип периода. Тип Строка. Содержит одно из значений:
    • Минута;
    • День;
    • Неделя;
    • Месяц;
    • Квартал;
    • Декада;
    • Полугодие.

Пример:
КонецПериода(ДатаВремя(2002, 10, 12, 10, 15, 34), "Неделя")

Результат:

13.10.2002 23:59:59

ДобавитьКДате

Функция предназначена для прибавления к дате некоторой величины.

Параметры:

  • Тип увеличения. Тип Строка. Содержит одно из значений:
    • Минута;
    • День;
    • Неделя;
    • Месяц;
    • Квартал;
    • Декада;
    • Полугодие.
Величина – на сколько необходимо увеличить дату. Тип Число. Дробная часть игнорируется.

Пример:
ДобавитьКДате(ДатаВремя(2002, 10, 12, 10, 15, 34), "Месяц", 1)

Результат:

12.11.2002 10:15:34

РазностьДат

Функция предназначена для получения разницы между двумя датами.

Параметры:

  • Выражение. Тип Дата. Исходная дата;
  • Выражение. Тип Дата. Вычитаемая дата;
  • Тип разности. Тип Строка. Содержит одно из значений:
    • Секунда;
    • Минута;
    • День;
    • Месяц;
    • Квартал;

Пример:
РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2002, 10, 12, 10, 15, 34),
ДАТАВРЕМЯ(2002, 10, 14, 9, 18, 06), "ДЕНЬ")

Результат:

Подстрока

Данная функция предназначена для выделения подстроки из строки.

Параметры:

  • Строка. Тип Строка. Строка, из которой выделяют подстроку;
  • Позиция. Тип Число. Позиция символа, с которого начинается выделяемая из строки подстрока;
  • Длина. Тип Число. Длина выделяемой подстроки.

Пример:
ПОДСТРОКА(Контрагенты.Адрес, 1, 4)

ДлинаСтроки

Функция предназначена для определения длины строки.

Параметр:
Строка. Тип Строка. Строка, длину которой определяют.

Пример:
Строка(Контрагенты.Адрес)

Данная функция предназначена для выделения года из значения типа Дата.

Параметр:
Дата. Тип Дата. Дата, по которой определяют год.

ГОД(РасхНакл.Дата)

Квартал

Данная функция предназначена для выделения номера квартала из значения типа Дата. Номер квартала в норме находится в диапазоне от 1 до 4.

Параметр
Дата. Тип Дата. Дата, по которой определяют квартал

КВАРТАЛ(РасхНакл.Дата)

Месяц

Данная функция предназначена для выделения номера месяца из значения типа Дата. Номер месяца в норме находится в диапа-зоне от 1 до 12.
Дата. Тип Дата. Дата, по которой определяют месяц.
МЕСЯЦ(РасхНакл.Дата)

ДеньГода

Данная функция предназначена для получения дня года из значения типа Дата. День года в норме находится в диапазоне от 1 до 365(366).
Дата. Тип Дата. Дата, по которой определяют день года.
ДЕНЬГОДА(РасхНакл.Дата)

День

Данная функция предназначена для получения дня месяца из значения типа Дата. День месяца в норме находится в диапазоне от 1 до 31.
Дата. Тип Дата. Дата, по которой определяют дня месяца.
ДЕНЬ(РасхНакл.Дата)

Неделя

Данная функция предназначена для получения номера недели года из значения типа Дата. Недели года нумеруются, начиная с 1.
Дата. Тип Дата. Дата, по которой определяют номера недели.
НЕДЕЛЯ(РасхНакл.Дата)

ДеньНедели

Данная функция предназначена для получения дня недели из значения типа Дата. День недели в норме находится в диапазоне от 1 (понедельник) до 7(воскресенье).
Дата. Тип Дата. Дата, по которой определяют день недели.
ДЕНЬНЕДЕЛИ(РасхНакл.Дата)

Данная функция предназначена для получения часа суток из значения типа Дата. Час суток находится в диапазоне от 0 до 23.
Дата. Тип Дата. Дата, по которой определяют час суток.
ЧАС(РасхНакл.Дата)

Минута

Данная функция предназначена для получения минуты часа из значения типа Дата. Минута часа находится в диапазоне от 0 до 59.
Дата. Тип Дата. Дата, по которой определяют минута часа.
МИНУТА(РасхНакл.Дата)

Секунда

Данная функция предназначена для получения секунды минуты из значения типа Дата. Секунда минуты находится в диапазоне от 0 до 59.
Дата. Тип Дата. Дата, по которой определяют секунды минуты.
СЕКУНДА(РасхНакл.Дата)

Выразить

Данная функция предназначена для выделения типа из выражения, которое может содержать составной тип. В случае, если выражение будет содержать тип, отличный от требуемого типа, будет возвращено значение NULL.

Параметры:
Преобразуемое выражение;
Указание типа. Тип Строка. Содержит строку типа. Например, "Число", "Строка" и т.п. Кроме примитивных типов данная строка может содержать имя таблицы. В этом случае будет осуществлена попытка выразить к ссылке на указанную таблицу.

Пример:
Выразить(Данные.Реквизит1, "Число(10,3)")

ЕстьNull

Данная функция возвращает значение второго параметра в случае, если значение первого параметра NULL.

В противном случае будет возвращено значение первого параметра.

Пример:
ЕстьNULL(Сумма(Продажи.СуммаОборот), 0)

Функции общих модулей

Выражение механизма компоновки данных может содержать вызовы функций глобальных общих модулей конфигурации. Никакого дополнительно синтаксиса для вызова таких функций не требуется.

Пример:
СокращенноеНаименование(Документы.Ссылка, Документы.Дата, Документы.Номер)

В данном примере будет осуществлен вызов функции "СокращенноеНаименование" из общего модуля конфигурации.

Отметим, что использование функций общих модулей разрешено только при указании соответствующего параметра процессора компоновки данных.

Кроме того, функции общих модулей не могут быть использованы в выражениях пользовательских полей.

Php?http://wiki.kint.ru/index.php/Язык_выражений_системы_компоновки_данных_(1Cv82)#.D0.9A.D0.BE.D0.BD.D0.B5.D1.86.D0.9F.D0.B5.D1.80.D0.B8.D0.BE.D0.B4.D0.B0

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
http://сайт

Эта статья - своего рода ответ на публикацию «Почему 1С это плохо и почему так не любят 1С программистов» . Я уже много лет занимаюсь 1С программированием и хочу сказать, что косо на нас смотрят именно из-за таких авторов статей. Давайте по порядку разберемся с тем, что мы имеем сейчас.

Платформа

У нас есть платформа и конфигурации написанные для нее.

Обновление платформы приносит дополнительный функционал, уносит некоторое количество багов и некоторое естественно приносит. В принципе, по моему личному мнению, ныть по поводу того, что после обновления платформы работа в офисе встала - не правильно. Во-первых, бэкапы баз перед обновлением должны спасти от проблем с базами. Ну и возможность вернуться на старую платформу никто не отменял. Это все равно что винить Microsoft или авторов свободного ПО за то, что после выпуска патча/обновления все слетело, а мысль сделать копию данных не пришла в вашу голову. Да, сейчас наблюдаются проблемы с программными ключами. Но можно пользоваться аппаратными (они немного дороже), либо на время проведения тех.работ для восстановления работоспособности офиса можно поставить не православные патчи, которые на время помогут решить проблему с отсутствием/недееспособностью ключа. Работа офиса в 30-40 человек важнее.

Конфигурации

Вот здесь есть где разгуляться критикам, но давайте по порядку.

Допустим, у нас обычная торговая организация и нам за глаза хватает функционала конфигурации «Управление торговлей 10.3/ 11».

Тут у нас есть два варианта использования этого программного продукта:

1. Пользоваться только базовым функционалом и обновляться ежемесячно по выходу новых версий кофигурации.
2. Не обновляться вообще и при необходимости дописывать функционал, который нам необходим.

По сути, второй вариант используется наиболее часто. Ставится конфигурация, настраивается и на протяжении всей жизни организации она практически не обновляется. Максимум - правятся печатные формы согласно постановлениям. Вот, в принципе, и все. Зачем постоянно мучится и переносить изменения из релиза в релиз - непонятно.

Конечно, можно возразить и сказать, что у организации есть, к примеру, бухгалтерия. Рассмотрим и такой вариант.

Бухгалтерию необходимо постоянно обновлять из-за изменения законодательства, ставок в налоговых и пенсионных фондах и прочих буднях тяжкого труда бухгалтеров.

Для передачи данных между торговлей и бухгалтерией используют обычно правила обмена. Это некое правило, написанное на xml, которое описывает какие объекты данных выгружаются, как они загружаются; также можно указать дополнительные обработки перед, после в момент выгрузки/загрузки. Если конфигурация торговли у нас неизменна, то правила выгрузки мы не трогаем (за редким исключением, если вдруг произошли координальные изменения). Правила загрузки мы менять будем тоже не часто. Факт поступления/продажи товара будет переносится всегда. А вот порядок начисления налогов и прочего будет уже расчитываться в обновленной бухгалтерии и это никак не повлияет на торговую конфигурацию.

Мне кажется, глупо напоминать, но я все же осмелюсь. Перед обновлениями и изменениями всегда стоит делать бэкапы. Ну согласитесь, глупо нытьб что после обновления все сломалось и вся фирма стоит колом. Т.к. нет возможности ни продать, ни выписать, ни позвонить. Все контакты, счета и информация в базе.

Использование 1С в различных сферах бизнеса

Да, компания 1С является монополистом на рынке программного обеспечения, предназначенного для автоматизации учета и сдачи бухгалтерской отчетности.

Если мы говорим о сегменте малого бизнеса, то для учета в большинстве фирм можно использовать почти любые программы, которые немного сложнее сводных таблиц в экселе. Учет штучного товара/услуг, учет дебеторки/кредиторки, расчет зарплаты. Сдача отчетности возможна через сторонние программы, в которые просто вбиваются итоговые цифры.
Если бизнес крупнее, то конкуренты 1С - это Navision, Oracle, в совсем крупных примерах это SAP.

Но здесь мы сталкиваемся с другой спецификой. Наше законодательство меняется довольно часто. И иностранные если уж и занимаются поддержкой актуальности своих программных продуктов, то не всегда успевают за изменениями. Так как количество внедрений «НЕ 1С программ» мало, то стоимость владения становится высокой. Сложно найти специалиста, способного быстро обновить (при условии наличия обновления) или настроить/сконфигурировать существующий программный продукт.

У 1С есть несомненные плюсы с подключением торгового оборудования (весы, сканеры, терминалы, табло). Притом в стандартных конфигурациях это делается на уровне пользователя. Добавим возможность подключения внешних обработок и печатных форм для расширения функционала, получения дополнительных отчетов без внесения изменений в кофигурацию. В итоге, если грамотно подойти, то лезть «внутрь» конфигурации нет смысла.

Другое дело, что проще и дешевле вписать костыль, который отвалится после обновления, и посадить клиента на иглу. Затем постоянно поливать 1С и говорить, что вот так часто они выпускают, и с такой же частотой приходить к клиенту и получать с него немного денюшек.

Мне кажется, что основная причина негатива к 1С в том, что код открыт. Никто не видел, как написан Word или Navision и никто не полезет туда дописывать свои кнопки, которые будут поступать совсем не так, как задумывалось разработчиками. Глупо писать, что обновляется все, даже то, чем я не пользуюсь. Не обновляйте модуль, который отвечает за закладки в браузере, я им не пользуюсь. Или колонтитулы в ворде совсем не нужны, уберите их из обновления. Не нравится - не обновляй, или при обновлении читайте, что поменялось.

От себя добавлю, что я не являюсь представителем фирм франчайзи или партнером. Занимаюсь автоматизацией учета на 1С более 7 лет. Если будет интересно, могу поподробней рассказать о тонкостях ведения учета в реалиях нашего времени.

Как правило, изучение любого языка программирования начинается с примера написания первой простейшей программы (“Hello world!”). Делается это для того, чтобы наглядно показать работу с базовыми синтаксическими конструкциями. Мы не будем делать исключение из этого общепринятого способа подачи материала при изучении новой среды разработки и поэтому нашу первую статью следует рассматривать в этом же ключе. В ней мы подробно разберем ответы на следующие вопросы, касающиеся программирования на платформе «1С:Предприятие 8»:

  • Где и при помощи чего писать программный код на встроенном языке 1С?
  • Что такое программные модули, какие существуют правила работы с ними?
  • Что такое переменная, как с ней работать, как и где её объявлять?
  • Какие операторы сравнения, присваивания и условий существуют и как их применять?
  • Булевы операции – что это и как с ними работать?
  • Зачем нужны циклы и как их использовать?

Статья будет полезна всем тем, кто еще не знаком с разработкой на платформе «1С:Предприятие 8», но хочет научиться программировать на 1С.

Применимость

Материал актуален для платформы «1С:Предприятие 8» редакций 8.2. и 8.3.

Переменные и операторы

В этой статье мы приступаем к изучению встроенного языка 1С:Предприятие 8. Исполняемый код содержится в программных модулях.

Существует достаточно большое количество модулей, которые предназначены для обработки различных событий.

Так, вход пользователя в систему обрабатывается в одном модуле, а обработка нажатия пользователя на некоторую кнопку – в совершенно другом.

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

В дальнейшем они могут быть использованы в процедурах и функциях этого модуля. Если переменная определена с ключевым словом Экспорт, то она будет доступна вне данного модуля. Пример строки объявления переменных:

Перем Склад, Подразделение, Кладовщик Экспорт;

После объявления переменных содержится раздел процедур и функций.

За ними располагается раздел основной программы, который будет выполняться в момент обращения к данному модулю.

Например, в разделе основной программы можно осуществить инициализацию переменных, т.е. присвоить им некоторые начальные значения:

Состояние=1;
НовоеВыражение=2;
Результат=3;

Модуль можно представить, как комбинацию различных операторов, которые выполняют разные нужные нам действия.

Разделителем операторов является символ «;» (точка с запятой). Этот знак является признаком окончания оператора. Т.е. оператор может быть записан в таком виде:

Результат=100Х200
+400
-600;

При этом не важно, на скольких строках располагается оператор.

Конечно, чаще удобнее и нагляднее располагать оператор в одной строке, но иногда операторы являются достаточно длинными (число строк обоснованно может достигать нескольких десятков).

Точку с запятой можно не ставить в завершающем операторе данной конструкции, например, процедуры. Т.е. следующий код будет работать:

Процедура ВычислениеЗначения()

ИсходноеЗначение = 100;
ПромежуточноеЗначение = ИсходноеЗначение/5;
ИтоговоеЗначение = ИсходноеЗначение+ПромежуточноеЗначение

КонецПроцедуры

Однако лучше использовать точку с запятой в завершающем операторе. Не исключено, что со временем конструкция будет продолжена, и завершающий оператор окажется уже не завершающим. Придется специально отслеживать эту ситуацию.

Переменные предназначены для того, чтобы хранить некоторые значения любого типа данных. Они используются для промежуточного хранения информации, для обработки.

Практически в любом программном модуле, который выполняет некоторые действия, есть различные переменные. Типизация переменных по значениям в Платформе 1С:Предприятие 8 мягкая.

Например, переменная может содержать значение одного типа данных, а через несколько строк – другого типа:

Создан = Ложь;
Создан = Истина;
Создан =100;

В первых двух операторах значение переменных булевское, а в третьем оно меняется на числовое значение. Т.е. типизация зависит от того значения, которое присваивается данной переменной.
Описывать переменные можно двумя способами:

  • неявный способ (упоминание в левой части оператора присваивания описывает данную переменную, нет предварительного описания переменной со словом Перем, т.е. нет специального раздела описания переменных);
  • явное описание переменных (Перем КонтрольныеДанные;). Явное описание переменных используется, например, если предполагается последующая передача этой переменной в функцию.

Для названия переменных используется классическое описание идентификатора. Идентификатор состоит из букв, цифр и знаков подчеркивания. Начинаться идентификатор должен либо с буквы, либо со знака подчеркивания.

При этом название переменной должно отображать смысл данной переменной. Названия переменных из одной буквы (типа А, В, С) являются плохими примерами. Они не отражают суть переменных.

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

В названии переменных нельзя использовать зарезервированные слова, такие как Процедура, Функция, Цикл, КонецЦикла и т.д. (эти конструкции выделяются в программном модуле красным цветом).

Зарезервированные слова – это операторы встроенного языка и их достаточно небольшое количество. Все они представлены в Синтакс-помощнике .

Следует отметить, что типы данных к зарезервированным словам не относятся (например, Массив, Булево, Истина, Ложь). Система такие имена переменных воспримет корректно.

Для написания программного кода регистр не имеет никакого значения. Например, слово Процедура можно писать как с большой, так и с маленькой буквы. Более того, большие и маленькие буквы можно чередовать внутри слова.

Для Платформы это не имеет никакого значения. Тем не менее, по правилам хорошего тона начало слова нужно писать с большой буквы, все остальные буквы маленькими.

По поводу языка. Можно использовать и русский язык, и английский, и комбинацию двух языков. Если кому-то удобно, можно спокойно использовать английский язык для написания программного кода, а также комбинировать русский и английский языки. Для Платформы это не важно.

Многие названия на английском языке довольно сложно помнить. При использовании комбинации двух языков ухудшается читаемость программного кода.

Булевы операции

В операторах сравнения очень часто используется булевская логика, которая возвращает значение Истина или Ложь.

Например, в условном операторе можно сравнивать: Если Событие = Продажа Тогда алгоритм пойдет по одной ветке (т.е. при значении Истина), по условию Ложь выполняется другая ветка алгоритма.

Условия могут быть достаточно сложными, они могут комбинироваться, при этом применяются следующие операторы: И, ИЛИ, и НЕ. Так, для оператора И:

Истина И Истина = Истина;
Истина И Ложь = Ложь;
Ложь И Истина = Ложь;
Ложь И Ложь = Ложь.

Для опрератора ИЛИ достаточно, чтобы один из операндов был равен Истина, тогда и значение комбинации будет Истина. Значение Ложь получается только в том случае, когда оба операнда Ложь.

Оператор НЕ просто инвертирует текущее значение (Ложь в Истину, Истину в Ложь).

С помощью комбинации данных операторов можно строить достаточно сложные условия. При составлении сложных условных операторов следует учитывать приоритеты.

Высший приоритет имеет оператор НЕ, следующим идет оператор И, а за ним оператор ИЛИ. То, что заключено в скобки, имеет самый высший приоритет и выполняется в первую очередь.

Например, расставим приоритеты (последовательность выполнения) для операций в приведенном выражении:

НЕ(Условие1 ИЛИ Условие2) И Условие3 ИЛИ Условие4
1. Результат1 = (Условие1 ИЛИ Условие2);
2. Результат2 = НЕ Результат1;
3. Результат3 = Результат2 И Условие1;
4. Результат = Результат3 ИЛИ Условие4;

Существует правило преобразования:

НЕ (Условие1 ИЛИ Условие2) = НЕ Условие1 И НЕ Условие2.

Однако не следует всегда стремиться упростить выражение, поскольку зачастую, по логике, проще читается выражение развернутое.

Оператор присваивания

Не следует путать оператор присваивания с равенством, не смотря на то, что у них одинаковое написание.

Принцип работы оператора присваивания таков, что левому значению (переменной с левой части) присваивается то значение, которое находится справа от знака равенства. Разберем пример:

Переменная1 = Переменная2 = Переменная3;

Переменной1 присваивается значение равенства из булевской логики, т.е. Истина, если Переменная2 = Переменная3, или Ложь в обратном случае.

При тестировании на должность начинающего программиста довольно часто используется задача: поменять значения двух переменных местами.

Данная задача решается с использованием оператора присваивания и имеет два решения.

Решение №1 с использованием временной переменной:
ВременнаяПеременная = Переменная1;
Переменная1 = Переменная2;
Переменная2 = ВременнаяПеременная;

Решение №2:
Переменная1 = Переменная1 + Переменная2;
Переменная2 = Переменная1 – Переменная2;
Переменная1 = Переменная1 – Переменная2;

Условный оператор

Есть такой оператор Если, после которого необходимо описать некоторое условие (само условие может быть достаточно большим). После условия следует слово Тогда и выполняемые операторы.

Далее может следовать ключевое слово Иначе и серия других операторов. Если разных условий несколько, можно использовать серию ключевых слов ИначеЕсли (см. пример ниже). Вся конструкция обязательно завершается ключевым словом КонецЕсли , после чего следует знак точки с запятой.

Кроме простого и множественного условия существует сокращенная форма условного оператора: ?(Условие, Выражение1, Выражение2);

Если условие истинное, то будет выполняться Выражение1 , в противном случае – Выражение2 . Пример кода: ДорогойТовар = ?(Товар.Цена>100000, Истина, Ложь);

На практике вместо записей сравнения со значением Истина (Ложь ) типа:

Если Переменная = Истина Тогда
и
Если Переменная = Ложь Тогда

реально используются эквивалентные записи:

Если Переменная Тогда
и
Если НЕ Переменная Тогда

Циклические операторы

Для любого вида цикла обязательно явное указание окончания этого цикла с помощью ключевого слова КонецЦикла . Существует несколько типов циклов.

Цикл по счетчику – цикл с фиксированным количеством повторений. Условием выхода из цикла является превышение граничного значения. Пример использования для расчета значения А!

А = 5;
Факториал = 1;
Для Счетчик = 1 По А Цикл
Факториал = Факториал * Счетчик;
КонецЦикла;

Цикл по условию – выполняется пока истинно условие данного цикла. Пример:

ОстатокСуммы = 1000;
ЦенаДополнительногоТовара = 243;
Количество = 0;
Пока ОстатокСуммы>0 Цикл
Количество = Количество+1;
ОстатокСуммы = ОстатокСуммы – Количество*ЦенаДополнительногоТовара;
ЦенаДополнительногоТовара = ЦенаДополнительногоТовара * 0.8;
КонецЦикла
Количество = Количество-1;

Данный цикл вычисляет, сколько единиц товара можно купить на данную сумму (1000 рублей), если после покупки каждой единицы товара предыдущая его цена умножается на коэффициент 0,8. Изначальная цена товара – 243 рубля.

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

Цикл по коллекциям (другое название Для каждого).

В Платформе существует достаточно большое количество коллекций (это такие контейнеры, которые содержат элементы определенного типа).

Обойти элементы коллекции можно с помощью цикла специального вида.

Например, существует массив чисел, необходимо посчитать сумму всех элементов массива:

Сумма = 0;
Для каждого Элемент Из Массив Цикл
Сумма=Сумма+Элемент;
КонецЦикла;

Для циклов существуют специальные операторы: Продолжить и Прервать .

Если в некоторой точке цикла выполнение дальнейших операторов данного витка становится бессмысленным, то чтобы вернуться на начало цикла и организовать его следующий виток используется оператор Продолжить .

Оператор Прервать позволяет закончить выполнение цикла, даже если условие цикла истинно.

На этом мы завершаем наше первое знакомство с разработкой на внутреннем языке 1С.

А как же Hello World? Мы же его еще не написали, да? Да, но ничто не мешает вам сделать это самостоятельно, т.к. знаний УЖЕ достаточно. Ну а если не получается, то можете подглядеть сюда.

Внимание! Перед вами ознакомительная версия урока, материалы которого могут быть неполными.

Войдите на сайт как ученик

Войдите как ученик, чтобы получить доступ к материалам школы

Внутренний язык программирования 1С 8.3 для начинающих программистов: простые логические выражения в 1С

На прошлом занятии мы научились давать имена и вводить их значения от пользователя.

Наберитесь сил и терпения. Занятия №5 и №6 будут трудными, но очень важными для дальнейшего понимания программирования в 1С. Поэтому, если хоть что-то останется непонятным или нераскрытым - перечитывайте, вдумывайтесь, задавайте вопросы.

Простые логические выражения

Сегодня, к уже изученным типам данных (строка, число и дата) добавим ещё один - логический тип. Он может принимать всего два значения: Истина или Ложь .

Значение логического типа (Истина или Ложь ) является результатом некоторого логического выражения.

Логическое выражение - это выражение, составленное при помощи операций сравнения. Сравнивать можно числа, даты, строки и другие данные. Вы читаете ознакомительную версию урока, полноценные уроки находятся . О логическом выражении можно сказать, верно оно (Истина ) или неверно (Ложь ).

Операции сравнения бывают следующие:

Думаю, интуитивно понятно, что обозначает каждая из операций.

Читается, например, так:

  • 1 = 1 ("один равен одному").
  • 4 <> 5 ("четыре не равно пяти")
  • 3 > 1 ("три больше одного").

Обращаю ваше внимание, что перечисленные три примера логических выражений принимают значение Истина , так как все они верны.

Разберем на примере:

Задание №14. Укажите для каждого логического выражения его результат - Истина или Ложь .

  1. "Венера" = "Юпитер"
  2. "Венера" <> "Юпитер"
  3. 123 = 321
  4. 123 < 321
  5. 123 <= 321
  6. 123 <= 123
  7. "20000101" <> "20140101"
  8. "20000101" = "20000101"
  9. "20140101" > "20120101"
  10. 25 + 25 = 50
  11. 2 * (10 + 10) > 50
  12. "Юрий" + " Гагарин" = "Юрий Гагарин"

Попытайтесь ответить на все вопросы самостоятельно. Вы читаете ознакомительную версию урока, полноценные уроки находятся . Затем посмотрите ответы ниже и попытайтесь разобраться, если где-то ошиблись.

  1. "Венера" = "Юпитер" (Ложь , строки не равны между собой, а в выражении утверждается, что равны).
  2. "Венера" <> "Юпитер" (Истина , строки не равны между собой, как и утверждается в выражении).
  3. 123 = 321 (Ложь , так как числа не равны между собой, а в выражении утверждается, что равны).
  4. 123 < 321 (Истина , так как 123 меньше 321, как и утверждается в выражении).
  5. 123 <= 321 (Истина , так как 123 меньше 321, а данное утверждение истинно, если левое число меньше или равно правому).
  6. 123 <= 123 (Истина , так как 123 равно 123, а данное утверждение истинно, если левое число меньше или равно правому).
  7. "20000101" <> "20140101" (Истина , так как левая дата 01.01.2000 не равна 01.01.2014, как и утверждается в выражении).
  8. "20000101" = "20000101" (Истина , так как левая дата 01.01.2000 равна 01.01.2000, как и утверждается в выражении).
  9. "20140101" > "20120101" (Истина , так как первое января 2014 года больше первого января 2012 года, как и утверждается в выражении).
  10. 25 + 25 = 50 (Истина, так как 25 плюс 25 действительно равно пятидесяти, как и утверждается в выражении).
  11. 2 * (10 + 10) > 50 (Ложь , так как результат левого выражения равен 40, а 40 меньше 50, хотя в утверждении говорится обратное).
  12. "Юрий" + " Гагарин" = "Юрий Гагарин" (Истина , так как сумма строк "Юрий" и " Гагарин" образует одну строку "Юрий Гагарин", которая равна строке справа, как и утверждается в выражении).

Заставим считать компьютер

Но, что же мы сами-то считаем "верно" или "неверно ". Ведь у нас под рукой компьютер! Давайте возложим эту задачу на него, а заодно и проверим себя.

К примеру, проверим выражение 2 * (10 + 10) > 50.
Для этого напишем такую программу:

Сообщить(2 * (10 + 10 ) > 50 ) ;

Если мы запустим её, то компьютер выдаст "Нет", что означает - результат равен Ложь .

Как он посчитал это выражение?

  1. Компьютер увидел команду Сообщить.
  2. Посмотрел, что за параметр мы передаем этой команде.
  3. Увидел, что в качестве параметра указано логическое выражение 2 * (10 + 10) > 50.
  4. Стал вычислять результат логического выражения.
  5. Увидел, что выражение состоит из левой части 2 * (10 + 10), правой части 50 и знака больше между ними.
  6. Посчитал результат левой части и выяснил, что он равен сорока.
  7. Снова взглянул на выражение, только в уже упрощенном виде 40 > 50, а так как 40, конечно же, меньше 50, то он вывел "Нет".

Задание №15. Вычислите все примеры логических выражений из предыдущего задания на компьютере.

Например, выражение "Венера" = "Юпитер" , значение которого, как мы выяснили, равно Ложь .

Сообщить("Венера" = "Юпитер" ) ;

Компьютер при запуске выводит значение "Нет", что означает: результат действительно равен Ложь и мы совершенно верно вычислили его сами.

Эталонное решение. Сначала пишем код сами, проверяем на компьютере (как и все примеры программ из уроков), только потом сверяемся

В продолжение темы:
Интернет, Wi-Fi

PDF Reader - это программное обеспечение, предназначенное для просмотра PDF-файлов, которое распространяется совершенно бесплатно. При этом вы сможете не только просматривать...

Новые статьи
/
Популярные