Встроенный язык
Встроенный язык является важной частью технологической платформы «1С:Предприятия 8», поскольку позволяет разработчику описывать собственные алгоритмы функционирования прикладного решения.
Встроенный язык имеет много общих черт с другими языками, такими как Pascal, Java Script, Basic, что облегчает его освоение начинающими разработчиками. Однако он не является прямым аналогом какого-либо из перечисленных языков.
Вот лишь некоторые, наиболее значимые особенности встроенного языка:
- предварительная компиляция — перед исполнением модули, содержащие текст на встроенном языке, преобразуются во внутренний код;
- кэширование скомпилированных модулей в памяти;
- мягкая типизация — тип переменной определяется типом значения, которое она содержит, и может изменяться в процессе работы;
- отсутствие программного описания объектов конфигурации — разработчик может использовать либо встроенные в платформу объекты, либо объекты, созданные системой в результате визуального конструирования прикладного решения.
Событийная ориентированность встроенного языка
Назначение встроенного языка в системе 1С:Предприятие определяется идеологией создания прикладных решений. Прикладные решения в 1С:Предприятии 8 не кодируются целиком. Большая часть прикладного решения создается разработчиком путем визуального конструирования — создания новых объектов конфигурации, задания их свойств, форм представления, взаимосвязей и пр. Встроенный язык используется лишь для того, чтобы определить поведение объектов прикладного решения, отличное от типового, и создать собственные алгоритмы обработки данных.
По этой причине модули, содержащие текст на встроенном языке, используются системой в конкретных, заранее известных ситуациях, которые могут возникнуть в процессе работы прикладного решения. Такие ситуации называются событиями. События могут быть связаны с функционированием объектов прикладного решения или с самим прикладным решением, как таковым.
Например, с функционированием объекта прикладного решения Справочник связан ряд событий, среди которых есть событие ПередЗаписью:
Это событие возникает непосредственно перед тем, как данные элемента справочника должны быть записаны в базу данных. Разработчик, используя встроенный язык, может описать алгоритм, который, например, будет проверять корректность данных, введенных пользователем. Разместив этот алгоритм в соответствующем модуле, разработчик обеспечит то, что каждый раз, как пользователь будет выполнять запись элемента справочника, система будет выполнять созданный разработчиком алгоритм и проверять, не забыл ли пользователь заполнить обязательные реквизиты справочника.
Таким образом можно сказать, что встроенный язык является скриптовым языком для программирования бизнес-логики, а использование модулей на встроенном языке является событийно-зависимым, т. е. выполнение модулей происходит при возникновении определенных событий в процессе функционирования прикладного решения.
Универсальные коллекции значений
Встроенный язык поддерживает работу с большим количеством разнообразных объектов. Безусловно, основную группу объектов составляют прикладные объекты, позволяющие описывать алгоритмы функционирования бизнес-логики.
Однако не менее важной группой являются объекты, предназначенные для хранения временных наборов данных в течение сеанса работы пользователя. Как правило, они служат для вспомогательного сбора, группировки, анализа и обработки информации:

Перечислим кратко их возможности:
Массив
Представляет собой пронумерованную коллекцию значений произвольного типа. К элементу массива можно обращаться по его индексу. В качестве элементов массива могут выступать, в частности, другие массивы. Это позволяет создавать многомерные массивы.
Структура
Представляет собой поименованную коллекцию, состоящую из пар ключ — значение. Ключ может быть только строковым, значение — произвольного типа. К элементу структуры можно обращаться по значению его ключа, т. е. по имени. Обычно используется для хранения небольшого количества значений, каждое из которых имеет некоторое уникальное имя.
Соответствие
Также как и структура, представляет собой коллекцию пар ключ — значение. Однако, в отличие от структуры, ключ может быть практически любого типа.
Список значений
Используется, как правило, для решения интерфейсных задач. Позволяет строить динамические наборы значений и манипулировать ими (добавлять, редактировать, удалять элементы, сортировать). Он может содержать значения любого типа, кроме того, в одном списке типы хранимых значений могут быть разными.
Например, список значений может использоваться для выбора конкретного документа из списка возможных документов, сформированного по сложному алгоритму.
Таблица значений
Таблица значений позволяет строить динамические наборы значений и манипулировать ими. Она может быть наполнена значениями любого типа, и в одной таблице типы хранимых значений могут быть разными.
Одним из примеров использования таблицы значений может служить организация представления в форме списка элементов справочника, отобранных по сложному алгоритму.
Дерево значений
Дерево значений представляет собой динамически формируемый набор значений любого типа, похожий на таблицу значений. В отличие от таблицы значений, строки дерева значений могут образовывать иерархические структуры: каждая строка дерева может иметь набор подчиненных строк, каждая из подчиненных строк, в свою очередь, также может иметь набор подчиненных строк и так далее. При этом поиск значений, сортировка, получение итогов могут осуществляться либо по текущему уровню иерархии, либо включая все подчиненные.
COMSafeArray
Представляет собой объектную оболочку над многомерным массивом SAFEARRAY из COM. Позволяет создавать и использовать SAFEARRAY для обмена данными между COM-объектами.
Фиксированный массив
Неизменяемый массив. Массив заполняется системой при инициализации объектов данного типа или разработчиком, с помощью конструктора.
Редактор текстов и модулей
Для создания и изменения текстов на встроенном языке разработчик может использовать редактор текста и модуля, обладающий удобными средствами создания, редактирования и синтаксической проверки модулей. Подробнее…
Разбор тестирования 1С:Профессионал и PMP
Встроенный язык 1С является частью платформы 1С:Предприятие, и нужен для создания алгоритмов в ходе разработки. Язык имеет схожие черты с другими языками программирования, но более нигде кроме 1С не используется. Поддерживается написание синтаксических конструкций на русском и английском языках:
Вопрос 06.82 экзамена 1С:Профессионал по платформе. С какой целью используется встроенный язык?
- Для определения интерфейса программы по умолчанию
- Для описания (на стадии разработки конфигурации) алгоритмов функционирования прикладной задачи
- Нет правильного ответа
Вопрос 06.83 экзамена 1С:Профессионал по платформе. Какое написание имеют функции встроенного языка?
- Только русское написание
- Только английское написание
- Русское и английское написание
- В зависимости от настроек конфигуратора
Вопрос 06.12 экзамена 1С:Профессионал по платформе. Какие функции отсутствуют во встроенном языке «1С:Предприятие 8»:
- Функции работы со значениями типа Дата
- Функции работы со значениями типа Время
- Функции работы со значениями типа Строка
- Функции работы со значениями типа Число
- Все вышеперечисленные функции имеются во встроенном языке
Запросы 1С:Предприятие 8. Прочие функции
В языке запросов 1С существует большое количество различных функций и операторов, облегчающих построение запроса. Часть из них мы рассмотрели в статьях Функции работы с датами, Группировки в запросах 1С, остальные рассмотрим сейчас.
Функции работы со строками в запросах 1С
Функций и операторов для работы со строковыми данными в запросах 1С немного.
Во-первых, строки в запросах можно складывать. Для этого используется оператор «+»:
Запрос . Текст = «ВЫБРАТЬ
» «Строка: » » + Источник.Наименование
Из Справочник.Источник КАК Источник» ;
Во-вторых, можно выделить часть строки. Для этого используется функция ПОДСТРОКА. Функция аналогична функции СРЕД () встроенного языка 1С. У нее три параметра:
- Строка-источник.
- Номер символа, с которого должна начинаться выделяемая строка.
- Количество символов.
Запрос . Текст = «ВЫБРАТЬ
ПОДСТРОКА(» «Строка: » «, 4, 3) КАК Результат» ; // Результат: ока
И, наконец, существует оператор, которые позволяет сравнить строку с неким шаблоном. Это оператор ПОДОБНО. О его использовании читайте в нашей статье о парамертах и операторах сравнения в запросах 1С.
Функция ЕСТЬNULL
NULL — особый тип данных на платформе 1С:Предприятие. Он же является единственным возможным значением этого типа. NULL может возникать в запросах в нескольких случаях: при соединениях источников запроса, если не было найдено соответствующего значения в одной из таблиц; при обращении к реквизитам несуществующего объекта; если NULL был указан в списке полей запроса (например при объединении результатов выборки из нескольких таблиц) и т.д.
Поскольку NULL не является ни нулем, ни пустой строкой, ни даже значением Неопределено, его часто бывает полезно заменять на какой-то более полезный тип данных. Для этого и предназначена функция ЕСТЬNULL.
Она имеет два параметра:
- Проверяемое значение.
- Значение, на которое нужно заменить первый параметр, если он оказался равен NULL.
Запрос . Текст = «ВЫБРАТЬ
ЕСТЬNULL(Источник.Остаток, 0) КАК Остаток» ; // Если в результате запроса поле остаток=NULL,
// то оно заменится на 0, и с ним можно будет выполнять математические действия
Функции ПРЕДСТАВЛЕНИЕ и ПРЕДСТАВЛЕНИЕССЫЛКИ
Эти функции предназначены для получения строковых представлений различных значений. То есть, они преобразуют ссылки, числа, булево и т.д. в обычный текст. Разница между ними в том, что функция ПРЕДСТАВЛЕНИЕ преобразует в текст (строку) любые типы данных, а функция ПРЕДСТАВЛЕНИЕССЫЛКИ — только ссылки, а остальные значения возвращает как есть, не преобразованными.
Запрос . Текст = «ВЫБРАТЬ
ПРЕДСТАВЛЕНИЕ (ИСТИНА) КАК Булево,
ПРЕДСТАВЛЕНИЕ (4) КАК Число,
ПРЕДСТАВЛЕНИЕ (Источник.Ссылка) КАК Ссылка,
ПРЕДСТАВЛЕНИЕ(ДАТАВРЕМЯ(2016,10,07)) КАК Дата» ;
// Булево = «Да», Число = «4», Ссылка = «Документ Расходный кассовый ордер №. от. »
// Дата=»07.10.2016 0:00:00″
Запрос . Текст = «ВЫБРАТЬ
ПРЕДСТАВЛЕНИЕССЫЛКИ (ИСТИНА) КАК Булево,
ПРЕДСТАВЛЕНИЕССЫЛКИ (4) КАК Число,
ПРЕДСТАВЛЕНИЕССЫЛКИ (Источник.Ссылка) КАК Ссылка,
ПРЕДСТАВЛЕНИЕССЫЛКИ (ДАТАВРЕМЯ(2016,10,07)) КАК Дата» ;
// Булево = ИСТИНА, Число = 4, Ссылка = «Документ Расходный кассовый ордер №. от. »
// Дата=07.10.2016 0:00:00
Функции ТИП и ТИПЗНАЧЕНИЯ
Функция ТИП возвращает тип данных платформы 1С:Предприятие.
Запрос . Текст = «ВЫБРАТЬ
ТИП (Число) ,
ТИП (Строка),
ТИП (Документ.РасходныйКассовыйОрдер)» ;
Функция ТИПЗНАЧЕНИЯ возвращает тип переданного в нее значения.
Запрос . Текст = «ВЫБРАТЬ
ТИПЗНАЧЕНИЯ (5) КАК Число,
ТИП (» «Строчка» «) КАК Строка,
ТИП (Источник.Ссылка) КАК Справочник
Из Справочник.Источник КАК Источник» ;
//Число=Число, Строка=Строка, Справочник = СправочникСсылка.Источник
Эти функции удобно применять, например, когда нужно выяснить является ли полученное в запросе поле значением какого-то типа. Например, получим контактную информацию контрагентов из регистра сведений КонтактнаяИнформация (там хранятся контакты не только контрагентов, но и организаций, физических лиц и т.д.):
Запрос . Текст = «ВЫБРАТЬ
КонтактнаяИнформация.Представление
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
ГДЕ
ТИПЗНАЧЕНИЯ(КонтактнаяИнформация.Объект) = ТИП(Справочник.Контрагенты)» ;
Функция ЗНАЧЕНИЕ
Функция Значение позволяет использовать в запросе объекты конфигурации 1С напрямую, без применения параметров запроса.
Дополним предыдущий пример еще одним условием. Необходимо получить только телефоны контрагентов.
Запрос . Текст = «ВЫБРАТЬ
КонтактнаяИнформация.Представление
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
ГДЕ
ТИПЗНАЧЕНИЯ(КонтактнаяИнформация.Объект) = ТИП(Справочник.Контрагенты)
И КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)» ;
Следует отметить, что эту функцию можно использовать только с предопределенными значениями, т.е. со значениями, к которым можно обратиться напрямую из конфигуратора. То есть функция ЗНАЧЕНИЕ не можно использоваться с элементами справочников, созданными пользователями, но может работать с перечислениями, с предопределенными элементами справочников, со значениями ПустаяСсылка.
Оператор ССЫЛКА
Оператор ССЫЛКА предназначен для проверки значений, получаемых запросом, на принадлежность к определенному ссылочному типу. Эту же задачу можно выполнить с помощью функций ТИП и ТИПЗНАЧЕНИЯ (которые имеют более широкую область применения и были рассмотрены выше).
Например, задачу выбора контактной информации контрагентов можно было решить и так:
Запрос . Текст = «ВЫБРАТЬ
КонтактнаяИнформация.Представление
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
ГДЕ
КонтактнаяИнформация.Объект ССЫЛКА Справочник.Контрагенты» ;
Оператор ВЫРАЗИТЬ
Оператор ВЫРАЗИТЬ используется в запросах 1С в двух случаях:
- когда нужно изменить характеристики примитивного типа;
- когда нужно из поля с составным типом данных сделать поле с одиночным типом.
К примитивным типам данных относятся: число, строка, дата, булево. Некоторые из этих типов данных имеют дополнительные характеристики. Тип Число имеет длину и точность, тип Строка — длину или неограниченность.
Оператор ВЫРАЗИТЬ позволяет изменять не тип данных, а именно дополнительные характеристики. Например, он может из строки с неограниченной длиной сделать строку с длиной ограниченной. Это бывает полезно, если нужно сгруппировать результаты запроса по такому полю. Выполнять группировку по полям с неограниченной длиной нельзя, поэтому мы его преобразуем в строку с длиной 200 символов.
Запрос . Текст = «ВЫБРАТЬ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПоступлениеТоваровУслуг.Ссылка) КАК Ссылка
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
СГРУППИРОВАТЬ ПО
ВЫРАЗИТЬ(ПоступлениеТоваровУслуг.Комментарий КАК СТРОКА(200))» ;
В ряде случаев, запросы к полям с составным типом данных могут обрабатываться платформой 1С неоптимально. Это приводит к увеличению времени выполнения запросов, поэтому бывает полезно заранее преобразовать составной тип в одиночный.
Запрос . Текст = «ВЫБРАТЬ
ВЫРАЗИТЬ(ДвижениеТоваровОбороты.Распоряжение КАК Документ.ЗаказКлиента).Дата КАК ДатаЗаказа,
ДвижениеТоваровОбороты.Номенклатура
ИЗ
РегистрНакопления.ДвижениеТоваров.Обороты КАК ДвижениеТоваровОбороты
ГДЕ
ДвижениеТоваровОбороты.Распоряжение ССЫЛКА Документ.ЗаказКлиента» ;
Операторы ВЫБОР и ЕСТЬ NULL
Оператор ВЫБОР аналогичен оператору ЕСЛИ во встроенном языке 1С, но имеет несколько урезанный функционал.
Допустим мы хотим получить контактные данные из регистра сведений КонтактнаяИнформация и при этом в отдельном поле запроса указать, принадлежат ли они контрагенту или физическому лицу.
Запрос . Текст = «ВЫБРАТЬ
КонтактнаяИнформация.Представление,
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(КонтактнаяИнформация.Объект) = ТИП(Справочник.Контрагенты)
ТОГДА » Контрагент »
ИНАЧЕ ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(КонтактнаяИнформация.Объект) = ТИП(Справочник.ФизическиеЛица)
ТОГДА » ФизЛицо »
ИНАЧЕ » Кто — то другой »
КОНЕЦ
КОНЕЦ КАК Владелец
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация» ;
Как видно из примера, в конструкции ВЫБОР всегда присутствует условие после слова КОГДА; значение, применяемое, если условие выполняется, после слова ТОГДА и значение, применяемое, если условие не выполняется, после слова ИНАЧЕ. Все три элемента конструкции ВЫБОР являются обязательными. Опустить элемент ИНАЧЕ, так же, как это делается при использовании оператора ЕСЛИ во встроенном языке 1С, нельзя. Также у оператора ВЫБОР отсутствует аналог конструкции ИНАЧЕЕСЛИ, зато можно вложить один ВЫБОР в другой, как и было сделано в нашем примере.
Оператор ЕСТЬ NULL используется в конструкции ВЫБОР для сравнения поля запроса с типом NULL.
Запрос . Текст = «ВЫБРАТЬ
ВЫБОР
КОГДА Значение ЕСТЬ NULL ТОГДА 0
ИНАЧЕ Значение
КОНЕЦ» ;
Кроме того, оператор ЕСТЬ NULL можно использовать в условиях запроса, например в предложении ГДЕ.
Раздел: Программирование Статьи по 1С Метки: язык запросов 1С
Добавить комментарий Отменить ответ

Теперь мы в соцсетях! Подписывайтесь, чтобы получать информацию о последних обновлениях или задать вопрос.
От экспертов «1С‑Рарус»: Аварийное завершение рабочих процессов кластера «1С» и полнотекстовый поиск данных
Большое предприятие ведет сложный производственный учет в системе «1С:ERP Управление предприятием 2.4». Кластер серверов 1С:Предприятия состоит из 7 узлов, регламентные операции выполняются раз в сутки в течение двухчасового технологического окна. В системе работают более 500 пользователей во всех 11 часовых поясах России. В связи с этим, активная работа происходит практически в режиме 24/7.
В определенный период времени начинают проявляться проблемы массового зависания системы одновременно у всех работающих в программе пользователей. Периодичность таких зависаний со слов клиента не понятна, а предположения администраторов в том, что происходит либо падение рабочих процессов rphost либо падение менеджера кластера rmngr. Также, со слов клиента, проблем с памятью и другими частями ресурсов сервера нет. Из особенностей внедрения в базе присутствует большое количество подключаемых внешних отчетов и обработок, настроенных на запуск в фоновом режиме.
Инфраструктура исследуемой системы
- Операционная система Windows Server 2016.
- База данных Microsoft SQL Server 2016 64х.
- Версия сервера 1C: 8.3.16.1502.
- Виртуализация с 280 Гб выделенной оперативной памяти.
- 500+ пользователей работающих практически во всех подсистемах «1С:ERP Управление предприятием 2.4» за исключением зарплатного блока.
Проверяем rphost и rmngr
Первоначально имеем предположение о том, что происходит падение рабочих процессов либо менеджера кластера. Попробуем разобраться с причиной таких падений. Для этого настроим технологический журнал «1С» на фиксацию следующих событий:
- ATTN — это событие мониторит состояние кластера серверов «1С» и записывает соответствующие диагностические сообщения.
- CLSTR — дополнительное событие по кластеру серверов «1С», фиксирующее изменения в его работе.
- CONN — фиксирует установку или разрыв клиентского соединения и сервера «1С».
- EXCP — фиксирует исключительные ситуации, которые могут послужить причиной аварийного завершения серверного/клиентского процесса.
- PROC — фиксация событий, влияющих на дальнейшее существование процесса «1С» (старт, аварийное завершение и т. д.).
Файл logcfg.xml, который используется при настройке технологического журнала приведен ниже:
Стартуем сбор логов технологического журнала, ждем очередного зависания сеансов и проводим анализ собранных данных. Прежде всего ищем информацию о падении/перезапуске рабочих процессов и находим следующую последовательность событий ATTN, приблизительно совпадающих со временем зависания системы:
1. 19:54.878017-0,ATTN,2,process=ragent,OSThread=14268,Descr=Temporary allowed memory limit exceeded for server,ServerID=07d60d35-23a8-460a-b035-5ebda093b157,HostName=rarus,TotalMemory(Kb)=283114996,TempAllowedProcessesMemory(Kb)=0 (80% of TotalMemory),TempAllowedTimeLimit=300,ExcessStartTime=20200930101949,ExcessDuration(sec)=5,ProcessList[pid, mem(Kb)]='[26380, 185359256], [10480, 30839344], [22440, 21679216], [3352, 727288]' 19:54.894007-0, 2. 20:09.925019-0,ATTN,2,process=ragent,OSThread=14268,Descr=Critical memory limit exceeded for server,ServerID=07d60d35-23a8-460a-b035-5ebda093b157,HostName=rarus,TotalMemory(Kb)=283114996,CriticalProcessesMemory(Kb)=0 (95% of TotalMemory),ExcessStartTime=20200930101949,ExcessDuration(sec)=20,ProcessList[pid, mem(Kb)]='[26380, 223309276], [10480, 30441068], [22440, 21164932], [3352, 1234416], [21604, 92772]' 3. 20:14.941018-0,ATTN,2,process=ragent,OSThread=14268,Descr=Process exceeded critical memory limit,agentURL=tcp://ppl-1c-02:1540,procURL=tcp://rarus:1561,Pid=10480,Name=rphost 4. 20:14.941019-0,ATTN,2,process=ragent,OSThread=14268,Descr=Process will be killed,agentURL=tcp://ppl-1c-02:1540,procURL=tcp://rarus:1561,Pid=10480,Name=rphost,logOnly=0,createDump=0
Система мониторинга кластера анализирует объем используемой памяти рабочих процессов и начинает завершение проблемных рабочих процессов в штатном режиме при достижении 80% от общего объема памяти, и в аварийном режиме если объем используемой памяти превысит 95%.
Существует возможность на уровне рабочих серверов «1С» ограничивать объем памяти, расходуемой рабочими процессами и менеджерами кластера. Для этого в консоли кластера серверов «1С» существуют следующие настройки:
- Временно допустимый объем памяти процессов. Срабатывает если рабочий сервер «потребил» больше памяти, чем указано в этом параметре. На такой рабочий сервер перестают назначаться новые соединения.
- Интервал превышения допустимого объема памяти процессов. Срабатывает, если через указанное время рабочий сервер все ещё продолжает превышать «Временно допустимый объем памяти процессов». В этом случае будет перезапущено такое количество процессов, чтобы оставшиеся процессы не потребляли больше, чем Временно допустимый объем памяти процессов.
- Критический объем памяти процессов. Срабатывает, если рабочий сервер «потребил» памяти больше, чем указано в этом параметре. Освобождение памяти будет выполнено немедленно. Процессы с наибольшим потреблением памяти будут остановлены аварийно, и затем запущены заново.
- Выключенные процессы останавливать через. Данная настройка определяет, через какое время завершится выключенный из-за превышения допустимого объема памяти процесс. Отсчет начинается с момента старта нового процесса и перевода клиентских соединений на него.
По умолчанию параметры «Временно допустимый объем памяти процессов» и «Критический объем памяти процессов» если их не задавать установлены как раз на 80% и 95% от общего объема памяти. График, показывающий влияние перечисленных параметров на перезапуск рабочих процессов:

Данные действия как раз фиксируются событиями ATTN, которые мы наблюдаем выше. Видим, что кластер серверов «1С» сначала зафиксировал объем использования оперативной памяти в 80% (событие 1) и начал завершение рабочих процессов в штатном режиме. Но уже через 15 секунд фиксируется следующее событие о том, что объем используемой памяти достиг 95% (событие 2). Это и приводит к аварийному завершению рабочих процессов кластера (события 3 и 4).
Несмотря на изначальные входные данные от клиента о том, что нет проблем с недостатком оперативной памяти и другими ресурсами сервера, видим значительное потребление памяти (более 280 Гб) рабочими процесса кластера серверов «1С».
От экспертов «1С‑Рарус»
База «1С» растёт и всё тормозит.
Что делать?
Ищем причины большого потребления памяти
Следующим шагом будет выяснение причин такого поведения системы. Для полноты картины нам не хватает следующих данных:
- Счетчиков Windows по занятой рабочими процессами «1С» памяти.
- Событий в технологическом журнале, в которых мы можем увидеть конкретных виновников потребления памяти.
Включим мониторинг ресурсов системы в Windows при помощи утилиты Performance monitor. Создадим группу сборщиков данных и добавим в нее счетчик «Байт виртуальной памяти» по всем процессам, а также с детализацией по процессам «1С» в системе. Для этого сначала выбираем счетчик в списке по конкретному процессу (rphost, rmngr, ragent), а затем редактируем имя процесса вручную, добавляя символ * в конец:

По умолчанию если процессов с одним и тем же именем несколько, то Performance monitor добавляет к каждому такому процессу порядковый номер (например, rphost#1). Для того, чтобы в имени счетчика отображался PID процесса необходимо отредактировать реестр, добавив в ветку HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfProc\Performance ключ ProcessNameFormat типа DWORD 32 бит со значением 2:

В файл настройки лога технологического журнала добавим следующие события:
- CALL — фиксирует входящий серверный вызов, его длительность, контекст и сколько было потрачено памяти;
- SCALL — фиксирует исходящий серверный вызов, собираем в паре с CALL для того, чтобы понять, кто был инициатором вызова;
- SDBL — фиксирует исполнение запросов к модели базы данных системы «1С:Предприятие», собираем дополнительно для того, чтобы понять, сколько времени от общего времени серверного вызова (CALL) заняли запросы.
Файл logcfg.xml будет выглядеть следующим образом:
Запускаем сбор логов, ждем падения рабочих процессов и проводим анализ собранных данных. Для начала взглянем на счетчики Performance monitor. Видим по ряду рабочих процессов rphost следующую ситуацию:

Количество потребляемой памяти либо неизменно, либо растет небольшими порциями, однако есть явные места, где происходит ступенчатый рост. Например, на графике выше потребление памяти процессом rphost с PID 29280 в период между 4 и 5 утра резко возросло с 4,7 до 9,7 Гб.
Взглянем на технологический журнал в такие промежутки времени и попробуем найти такие серверные вызовы CALL, свойство которых memory было бы максимальным. Данное свойство покажет нам объем занятой, но не освобожденной памяти за время серверного вызова.
Находим событие CALL следующего содержания:
21:40.004031-30955031,CALL,2,process=rphost,p:processName=rarus_master-copy,OSThread=8852,t:clientID=3404,t:applicationName=1CV8C,t:computerName=SRV-RARUS-11,t:connectID=2224,callWait=0,Usr=ИвановИИ,SessionID=1,Interface=bc15bd01-10bf-413c-a856-ddc907fcd123,IName=IVResourceRemoteConnection,Method=0,CallID=8986,MName=send,Memory=2571688604,MemoryPeak=2577368322,InBytes=111046682,OutBytes=111115207,CpuTime=24281250
Серверный вызов, который согласно свойству memory занял, но не освободил более 2,5 Гб памяти. Причем свойство context у данного события отсутствует. Также обращаем внимание на свойство processName, которое в данном случае совпадает с именем базы, в которой зафиксирован данный вызов. Видим, что это не основная база, в которой работают пользователи, а ее копия.
На следующем скрине также наглядная демонстрация того, что в топе по занятой памяти серверных вызовов находятся не основные базы:

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

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

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

Обращаем внимание на строку Mapped File, которая показывает, какой объем памяти от общего объема занят закешированными в памяти файлами. На закладке File Summary, можем посмотреть на список этих файлов:

Видим, что в топе по размеру файлы indexmain.bin и indextemp2.bin. Это и есть индекс полнотекстового поиска базы. Принимаем решение о полном отключении индекса, что освободит дополнительные ресурсы и уменьшит объем сеансовых данных. К тому же, из-за того, что предприятие активно работает практически 24/7, довольно сложно организовать регламентный пересчет индекса во внерабочие часы. Более подробную информацию об устройстве индекса полнотекстового поиска можно найти в конце статьи.
2. Серверные вызовы без контекста со значением свойства iname равным IVResourceRemoteConnection.
24:35.135009-24329972,CALL,1,process=rphost,p:processName=rarus,OSThread=11632,t:clientID=77,t:applicationName=1CV8C,t:computerName=PC1085,callWait=0,Usr=ИвановИИ,SessionID=2878,Interface=bc15bd01-10bf-413c-a856-ddc907fcd123,IName=IVResourceRemoteConnection,Method=0,CallID=13939,MName=send,Memory=2377792063,MemoryPeak=2382649864,InBytes=36796135,OutBytes=37680370,CpuTime=21406250
Понять, что это за вызовы можно, если найти в логе технологического журнала событие CONN, которое фиксирует недавний старт соединения с тем же clientID:
24:10.524007-0,CONN,0,process=rphost,OSThread=11448,ClientID=77,Protected=1,Txt='Accepted, client=(2)хх.хх.хх.хх:53989, server=(2)хх.хх.хх.хх:1560, marker=1'
Такие строки не являются утечкой памяти — это перенос клиентского соединения с одного рабочего процесса на другой. Сеансовые данные, которые были привязаны к старому клиентскому соединению переносятся на новое. Об этом и говорят нам вышеуказанные события.
3. Серверные вызовы CALL, фиксирующие выполнение длительных операций(запуск внешних отчетов).
00:29.195062-3641044,CALL,1,process=rphost,p:processName=rarus,OSThread=28448,t:clientID=3853,t:applicationName=1CV8C,t:computerName=PC-OMSK-203,t:connectID=1877,callWait=0,Usr=ИвановИИ,SessionID=1929,Context=Система.ПолучитьФорму : ВнешнийОтчет.РеестрБанковскойВыписки.Форма,Interface=bc15bd01-10bf-413c-a856-ddc907fcd123,IName=IVResourceRemoteConnection, …
Ситуация с не освобождением памяти при этом возможна в двух случаях:
- Пользователь сформировал отчет за большой период времени и не закрыл форму отчета. Пока форма будет открыта внутри сеанса данные не будут очищены.
- Пользователь закрыл форму после формирования отчета, но внутри формы были циклические ссылки. Данная ситуация приводит к тому, что сеансовые данные по такой форме не освобождаются. Это может объяснить ступенчатую деградацию процессов rphost по используемой памяти.
Для проверки возможного наличия циклических ссылок добавим в файл настроек технологического журнала «1С» событие SCRIPTCIRCREFS.

Данное событие позволяет обнаружить информацию о циклических ссылках в технологическом журнале. Стоит отметить, что событие в технологическом журнале не гарантирует наличие циклической ссылки, а означает лишь подозрение на циклическую ссылку.
![]()
ВАЖНО! Сбор технологического журнала с данным событием может нагружать ресурсы системы, поэтому замеры необходимо производить в минимально возможный период времени.
После запуска сбора технологического журнала с новыми настройками видим в логах строки вида:
00:27.726064-1,SCRIPTCIRCREFS,2,process=rphost,p:processName=rarus,OSThread=28448,t:clientID=3853,t:applicationName=1CV8C,t:computerName=PC-OMSK-203,t:connectID=1877,SessionID=1929,Usr=ИвановИИ,AppID=1CV8C,ModuleName=ОбщийМодуль.ОтчетыСервер.Модуль,ProcedureName=ЗарегистрироватьПоле,Cycles='VariableName: Информация CircularRefsMembers: Информация.НастройкиВарианта.Строки[0].Строки[0].Владелец, Информация.НастройкиВарианта.Строки[0].Строки[0].Владелец.Строки, Информация.НастройкиВарианта.Строки[0].Строки[0].Владелец.Строки[0], Информация.НастройкиВарианта.Строки[0].Строки[0].Владелец VariableName: НастройкаВарианта CircularRefsMembers: НастройкаВарианта.Владелец, НастройкаВарианта.Владелец.Строки, НастройкаВарианта.Владелец.Строки[0], НастройкаВарианта.Владелец ',Context='Система.ПолучитьФорму : ВнешнийОтчет.РеестрБанковскойВыписки.Форма
Система фиксирует подозрение на циклические ссылки как раз при формировании внешних отчетов, что подтверждает нашу изначальную гипотезу. Однако работа по поиску циклических ссылок не тривиальна и требует отдельной итерации расследования. Мы расскажем об этом в одной из следующих статей. Пока принимаем решение сообщить клиенту о возможной проблеме и приступать к ней только в случае, если остальные принятые действия не приведут к желаемому результату.
От экспертов «1С‑Рарус»
Страничные блокировки в MS SQL Server
при проведении документа в документе в 1С
Полнотекстовый поиск данных. Общее устройство и управление ППД в «1С»
Полнотекстовый поиск данных (англ.Full Text Searching, ППД) — это способ осуществления поиска в текстовых данных. В основном данный вид поиска используют для поиска в большом объеме данных, т. к. он существенно быстрее обычного поиска, который можно осуществить на языке запросов с помощью предиката ПОДОБНО (LIKE). Например, выполнение запроса с предикатом ПОДОБНО к нескольким миллионам строк неструктурированных текстовых данных может занять несколько минут, а полнотекстовый запрос всего несколько секунд или даже меньше, в зависимости от количества возвращаемых строк. Также предикат ПОДОБНО работает только с комбинациями символов в отличии от полнотекстовых запросов.
К основным задачам, решаемым с помощью механизма ППД можно отнести:
- Выполнение нечеткого поиска с возможностью указания порога нечеткости.
- Поиск с учетом синонимов различных языков. Например, русского, английского или украинского языка. В частности, поддержка английского языка помогает пользователям продуктов Adizes Executive Dashboard и 1C-Rarus: Finance management, которые предназначены для международного рынка.
- Поиск с учетом замещения. Когда части символов написаны на другой клавиатурной раскладке.
- Поиск с учетом транслитерации.
- Поиск слов или фраз, находящихся рядом с другими словами или фразами.
- Поиск с учетом поисковых операторов или регулярных выражений.
Нечеткий поиск — это способ поиска, при котором выполняется сопоставление информации заданному образцу поиска или близкому к этому образцу значению. Например, нечеткий поиск по запросу «машина» будет возвращать также «калина», «Марина», «шина» и т. п.
Для обеспечения высокой скорости обработки больших объемов данных механизм полнотекстового поиска использует полнотекстовый индекс. В полнотекстовом индексе хранятся данные о значимых для поиска словах и их расположении в одном или нескольких столбцах таблицы базы данных.
Механизм полнотекстового поиска используется в различных системах. В том числе, в системах управления базами данных и поисковых системах. Платформа 1С:Предприятие 8, также включает в себя данный механизм. Однако, из-за недостатка открытых источников с описанием его архитектуры, предлагаем ознакомиться с аналогичным механизмом продукта Microsoft SQL Server.
Данный продукт включает в себя механизм ППД и выделяет следующие его компоненты:
- Пользовательские таблицы. Непосредственно таблицы информационной базы, по которым осуществляется полнотекстовое индексирование.
- Средство сбора полнотекстовых данных. Отвечает за планирование заполнения полнотекстовых индексов и управление им.
- Файлы тезауруса. Файлы содержащие синонимы искомых слов.
- Список стоп-слов. Список наиболее встречающихся слов, которые исключаются при поиске.
- Обработчик запросов. Отвечает за компиляцию и выполнение SQL-запросов. Если SQL-запрос включает запрос полнотекстового поиска, то запрос направляется в средство полнотекстового поиска.
- Средство полнотекстового поиска. Отвечает за компиляцию и выполнение полнотекстовых запросов, поддержку индексов, а также взаимодействует с файлами тезауруса и списков стоп-слов.
- Модуль записи индекса. Формирует структуру, используемую для хранения индексов.
- Диспетчер управляющей программы фильтрации. Отвечает за мониторинг состояния узла управляющей программы фильтрации (fdhost.exe) для полнотекстового поиска.
- Обработчик протокола. Отвечает за передачу данных из памяти в узел управляющей программы фильтрации, в котором требуемым образом применяется фильтрация и средство разбиения по словам.
- Фильтры. Отвечает за предварительную фильтрацию текстовых данных при полнотекстовой индексации. Например, при обработке XML структуры файла удаляется форматирование текста.
- Средства разбиения по словам и парадигматические модули. Используется для лингвистического анализа текстовых данных при полнотекстовой индексации. Например, компонента находит границы слов в соответствии с лексическими правилами данного языка (разбиение по словам).
Схема механизма полнотекстового поиска данных Microsoft SQL Server
Стоит отметить, что основной компонентой механизма ППД является «Средство полнотекстового поиска», т. к. она отвечает за поддержку индексирования и формирование запросов.
Архитектура полнотекстового индекса
Полнотекстовый индекс — это специальный тип функционального индекса на основе ключевых слов, создаваемый и используемый средством полнотекстового поиска. Процесс создания полнотекстового индекса отличается от создания прочих индексов. Вместо создания сбалансированного дерева на основе значения, хранящегося в конкретной строке, служба полнотекстового поиска создает инвертированную стековую сжатую структуру индекса на основе отдельных ключевых слов индексируемого текста.
Представим, что в информационной базе существует таблица «Номенклатура», у которой включен полнотекстовой индекс. Пример содержимого таблицы:
| Код | Наименование |
|---|---|
| 1 | Булочка со сгущенкой |
| 2 | Торт «Наполеон» со сгущенкой |
| 3 | Булочка с капустой |
После выполнения построения индексов система подготовит следующий фрагмент индекса:
- Ключевое слово — содержит представление лексемы, извлеченной при индексировании.
- Идентификатор колонки — соответствует идентификатору индексируемой колонки. При этом нумерация колонок начинается с 0.
- Идентификатор записи — соответствует значению полнотекстового ключа конкретной таблицы.
- Позиция — содержит целочисленное значение, которое отвечает за относительное смещение в хранимом значении. Например, во второй записи лексема «Наполеон» является второй лексемой из чего система определяет позицию равной 2. При этом позиция лексемы учитывает стоп-слова.
Также стоит обратить внимание, что лексемы «со» или «с» были удалены из полнотекстового индекса. Это связано с тем, что они являются стоп-словами. Удаление стоп-слов из полнотекстового индекса может привести к значительной экономии дискового пространства, тем самым увеличивая производительность запросов.
Логический полнотекстовой индекс обычно разбивается на несколько внутренних таблиц, которые называются фрагментом. При создании новых записей или изменении уже старых формируются новые фрагменты. Однако наличие большого количества полнотекстовых фрагментов индекса может приводить к существенному уменьшению производительности. Для уменьшения количества фрагментов требуется выполнять слияние в единый индекс, тем самым формируя основной индекс и удаляя устаревшие записи.
Процесс полнотекстового индексирования
Для выполнения операции полнотекстового индексирования средство полнотекстового поиска перемещает пакеты данных в память. Затем управляющая программа получает данные пакеты и выполняет фильтрацию с разбиением по словам, а также преобразовывает входные данные в инвертированный список слов. После чего средство полнотекстового поиска запрашивает конвертированные данные из списка слов, удаляет стоп-слова и сохраняет списки слов в виде пакета в один или несколько инвертированных фрагментов.
При этом для удаления стоп-слов и нормализации ключевых слов перед их сохранением в полнотекстовом индексе или фрагменте индекса может быть проведена дополнительная обработка.
После завершения операции заполнения инициируется заключительный процесс слияния фрагментов индекса в один основной полнотекстовый индекс.
Обработка полнотекстовых запросов
Обработчик запросов инициализирует запрос к средству полнотекстового поиска. Средство полнотекстового поиска разбивает запрос по словам при необходимости дополняет синонимами, далее выполняется морфологический поиск и обработка стоп-слов. Затем полнотекстовые части запроса преобразуются в формат операторов SQL. Во время выполнения запроса происходит обращение к инвертированному индексу. Результат запроса возвращаются клиенту.
Устройство и управление в платформе «1С:Предприятие 8»
Платформа «1С:Предприятие 8» использует собственно разработанный механизм полнотекстового поиска, что позволяет отказаться от поддержки полнотекстового поиска самих систем управления базами данных. Однако его архитектура не отличается от ранее рассмотренной архитектуры Microsoft SQL Server. Например, Механизм ППД платформы «1С:Предприятие 8» аналогично разделяется на: файлы полнотекстового индекса и механизма полнотекстового поиска. При этом сам полнотекстовый индекс разделяется на основной и дополнительный индекс, которые соответствуют основному и дополнительным фрагментам.
Место хранения
Платформа «1С:Предприятие 8» размещает все файлы полнотекстового поиска данных в служебном каталоге 1Cv8FTxt:
- Для файловой базы: ..\\1Cv8FTxt\
- Для клиент-серверной базы: ..\srvinfo\reg_\\1Cv8FTxt\
В данном каталоге размещаются все файлы необходимые для механизма ППД. Например, файлы основного (indexMain.bin) и дополнительного индекса (indexPartial.bin), временные файлы изменений (changesХХХХХХХХХХХХХХ.log) и многие другие.

Инструменты управления
Управление полнотекстовым поиском осуществляется как в режиме 1С:Предприятие, так и с помощью методов встроенного языка.
Для открытия окна управления в режиме 1С:Предприятия необходимо выполнить действия:
- Обычное приложение:
- Пункт меню «Операции».
- Управление полнотекстовым поиском.
- Пункт меню «Главное меню».
- Функции для технического специалиста / Все функции.
- Стандартные.
- Управление полнотекстовым поиском.

Окно «Управление полнотекстовым поиском» в обычном режиме

Окно «Управление полнотекстовым поиском» в управляемом режиме
К основным операциям можно отнести:
- Обновление индекса без слияния — Создание или обновление дополнительных индексов.
- Обновление индекса со слиянием — Создание или обновление основных индексов.
- Очищение индекса — Обнуление существующего основного индекса.
- Проверка индекса — Анализ актуальности текущего состояния индексов.
Во встроенном языке существуют методы, соответствующие данным операциям:
- Обновление индекса без слияния
ПолнотекстовыйПоиск.ОбновитьИндекс(Ложь) - Обновление индекса со слиянием
ПолнотекстовыйПоиск.ОбновитьИндекс(Истина) - Очищение индекса
ПолнотекстовыйПоиск.ОчиститьИндекс() - Проверка индекса
ПолнотекстовыйПоиск.ИндексАктуален()
Также важно понимать, что полнотекстовый поиск будет осуществляться по объектам, у которых установлено свойство Полнотекстовый поиск/Использовать. Данное свойство установлено по умолчанию и если перед нами встает задача редуцировать количество объектов, участвующих в поиске, то для конфигураций, стоящих на поддержке от типовых приходится включать возможность редактирования, что приводит к более сложному процессу обновления. В типовых решениях существуют объекты, состоящие из огромного количества реквизитов, тип которых попадает в спектр поиска: Строка, Данные ссылочного типа (ссылки на документы, справочники),Число, Дата, ХранилищеЗначения.

По всем ним по умолчанию установлено свойство полнотекстового поиска. И конечно можно осуществить редуцирование количества сущностей для построения таблицы индекса поиска и по ним тоже. Еще раз следует заметить, что в этом случае возрастает число модифицированных объектов и их свойств. Чтобы облегчить задачу обновления конфигурации можно воспользоваться средствами автоматического обновления конфигураций, например решением Управление обновлением конфигураций «1С».
Использование полнотекстового поиска данных должно быть осознанным
Итак, какие выводы можно сделать из данного случая и чему научила нас эта история.
Еще и еще раз убедились, что “Everybody lies” (Все врут) как говорил Доктор Хаус из культового сериала про врачебную экспертизу. В нашем случае заказчик уверяет, что проблем по потреблению памяти не наблюдается, а они есть. И разумеется эксперт должен полагаться только и исключительно на факты, а не на слова. Поэтому всегда проверяем и перепроверяем гипотезы. В обязательном порядке при обнаружении проблем, связанных с утечкой памяти в кластере «1С» нужно убедиться, что правильно произведены настройки по перезапуску рабочих процессов. Подробнее о перезапуске рабочих процессов можно прочитать в статье Замедление работы 1С:Управление торговлей через 6 часов после запуска сервера «1С».
Второе, что следует сказать, расследование может быть многоэтапным и к этому нужно быть готовым. Проверили базовую гипотезу по памяти, отвергли или приняли ее, исключили «шум» в виде ненужных баз в продуктивном контуре и далее сфокусировались на поиске конкретного виновника по утечке памяти.
Третий важный пункт относится к развитию и эксплуатации системы. Всякий раз, когда принимается решение об использовании того или иного механизма платформы, важно учитывать ряд критериев, чтобы не пожалеть о выборе или не столкнуться в процессе эксплуатации на больших системах с проблемами производительности:
- Общеархитектурное устройство механизма, чтобы делать выбор о включении осознанно.
- Связь каждой части в архитектуре с ростом объема данных, чтобы ответить на вопрос, что будет происходить, когда база вырастет.
- Регламент обслуживания механизма, чтобы состыковать его с регламентом работы предприятия.
Как мы смогли увидеть выше, объем таблицы для полнотекстового поиска с одной стороны весьма велик, а с другой в случае если его не актуализировать сама ценность от использования механизма существенно падает.
Поэтому в данном случае можно было бы рекомендовать:
- Оставлять ППД только и исключительно на рабочей базе.
- Позаботиться о том, чтобы объем оперативной памяти был бы достаточен в момент слияния таблиц индексов поиска.
- Включать обновление только и исключительно в момент технологического перерыва и, возможно, даже не ежедневно.
- Произвести отключение полнотекстового поиска для объектов метаданных, оставив только нужные или даже спуститься ниже — к реквизитам объектов.
- И как крайний вариант — рассмотреть вопрос об отказе использования механизма ППД.
Клиентом были выбраны пункты «оставить ППД только и исключительно на рабочей базе» и «отказ от использования механизма ППД». Проблем с падением более не наблюдалось.
Интересующиеся базами данных и 1С:Предприятием могут посмотреть предыдущие статьи от экспертов «1С‑Рарус»:
- Страничные блокировки в MS SQL Server при проведении документа в документе в «1С»
- База «1С» растёт и всё тормозит. Что делать?
