1с пишет что запрос не выполнен
Недавно столкнулся с неприятной ошибкой на одном из старых серверов с 1С. Решил записать решение, чтобы не забыть и с другими поделиться. При определенных обстоятельствах пользователь не может зайти в базу 1С, получая ошибку во время логина на нехватку памяти.
Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужно пройти вступительный теcт.
Введение
Данная ошибка может сопровождаться разным названием и описанием, но по смыслу они будут примерно одинаковые. Суть в том, что не хватает оперативной памяти для входа в базу. Но при этом совсем не очевидно, о какой памяти идет речь. Например, вот текст:
Невосстановимая ошибка
Ошибка при выполнении запроса POST к ресурсу /e1cib/login:
по причине:
Ошибка СУБД:
Microsoft SQL Server Native Client 11.0: Ошибка выделения памяти
HRESULT=80004005,
Изначально мне показалось, что проблема с нехваткой памяти для работы MSSQL сервера. Так что я пошел и отрегулировал ее потребление в настройках сервера. Но это не помогло. На следующий день пользователи опять периодически стали получать эту ошибку, хотя на сервере было достаточно свободной оперативной памяти. Стал разбираться дальше.
Неспецифицированная ошибка работы с ресурсом
Второй вариант текста той же самой ошибки выглядел следующим образом:
Неспецифицированная ошибка работы с ресурсом
Ошибка при выполнении запроса GET к ресурсу /e1cib/cmi/commands:
Недостаточно свободной памяти для выполнения операции
После этого я уже понял, что проблема не в MSSQL сервере, а в самой 1С. Поиск в интернете и анализ ситуации на сервере привел к пониманию проблемы. Суть ее вот в чем. Сервер 1С создал рабочий процесс rphost, который обслуживает подключения к базам данных. В моем случае сервер 1С 32-х битный, так что он ограничен по максимальному использованию памяти одним рабочим процессом.
Решение проблемы "недостаточно свободной памяти для выполнения операции" в 1С
В общем случае данную проблему можно решить следующим образом. Открываем консоль управления кластером, идем в раздел Рабочие серверы, выбираем свой сервер и его свойства. Меняем 2 параметра:
- Количество ИБ на процесс.
- Количество соединений на процесс.
Чтобы проблема ушла, вам необходимо уменьшить значения. Определить оптимальные сходу вряд ли получится. Для начала можете их просто уменьшить вдвое, поставив 4 и 128 соответственно.
Заключение
Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!
Если нет возможности изменить настройки из-за несоответствия лицензии, временно поможет перезапуск сервера 1С. Но работать он будет нормально до тех пор, пока очередной рабочий процесс не займет максимально возможную для себя память. На практике это в районе 3.5 Гб. После этого если не запустится новый рабочий процесс, новые подключения к базам будут невозможны. Придется раскошелиться на 64-х битный сервер.
Если у вас медленно работает сервер 1С, читайте мою статью по его профилированию - Процесс 1С rmngr.exe грузит процессор.
Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров.
Проверьте себя на вступительном тесте и смотрите подробнее программу ссылке.
Цель запроса - выбрать из Таблицы Значений то, чего нет в регистре. Говорят, что ЛЕВОЕ СОЕДИНЕНИЕ с IS NULL медленнее.
(1) PerlAmutor, для начала. ТЗ во временную таблицу можно только поместить. Никаких дополнительных операций там делать нельзя. Все остальное только в следующем блоке пакета.
(5) PerlAmutor, левое соединение без вложенного запроса отрабатывает оптимально за счет поиска по индексу
С этими временными таблицами и Таблицами Значений засада полная. Оказывается в таблице значений надо обязательно указывать тип данных колонок, причем строки неограниченной длинны он не принимает, Надо прописывать максимальное количество символов в колонке ТЗ. А если эта ТЗ появляется из чужого модуля, то поменять тип колонки постфактум уже нельзя - надо пилить исходники. И если это сделать, то уже этот модуль никогда не вернет колонку длиннее чем указал. В итоге вариант какой, создать еще одну ТЗ и перезалить туда все данные из первой ТЗ предварительно описав типы колонок и их размеры/длинны/точности и т.п.? Жесть какая.
(8) PerlAmutor, про типы известно давно иначе как запрос не поймет , что это за тип. Плюс еще совет запрос по ТЗ выводить в отдельный запрос
как пример
Надо прописывать максимальное количество символов в колонке ТЗ. А если эта ТЗ появляется из чужого модуля, то поменять тип колонки постфактум уже нельзя - надо пилить исходники.
или добавить колонку с нужным типом и
Таблица.ЗагрузитьКолонку(Таблица.ВыгрузитьКолонку("Колонка1"),"Колонка2");
(8) Я так понял, что ТЗ в качестве результата возвращает чужая функция. Перенести ТЗ в параметры функции, в чужой функции убрать создание ТЗ и её возврат. Во всех вызовах чужой функции создание нетипизированной ТЗ перед вызовом. В своем коде предусмотреть создание типизированной ТЗ перед вызовом. Если ТЗ уже является параметром, то вообще изменений по минимуму.
1С же меня не спрашивает про тип, когда я в регистр сведений записываю данные из ТЗ с безтиповыми полями.
1С же меня не спрашивает про тип, когда я в регистр сведений записываю данные из ТЗ с безтиповыми полями
Да. 1С просто пошлет, если типы не будут соответствовать. Какие типы нужны у 1С есть информация.
В случае ТЗ без описания типов переданную в запрос, 1С просто не знает что там и как с этим работать.
Я конечно могу ошибаться, но такое вариант более надежный (это мое мнение) . Просто у меня был похожий случай и запрос не выдавал ничего. После того как вынес получение данных из ТЧ в отдельный запрос все заработало - возможно это был мой косяк , но в указанном мной примере, я точно знаю, что данные из ТЧ попадут.
(14) vadim1011985, я бы не рекомендовал без особой необходимости так делать. Если это не файловая база, а полноценный сервер с отдельным sql сервером и достаточно нагруженный, то будет дополнительное(лишнее) обращение к нему.
Это плохой пример с точки зрения архитектуры программы.
Мне интересно сколько 1С по времени будет перелопачивать 10 колонок с половиной миллиона строк.
Да. 1С просто пошлет, если типы не будут соответствовать. Какие типы нужны у 1С есть информация.
В случае ТЗ без описания типов переданную в запрос, 1С просто не знает что там и как с этим работать.
Я эти колонки заполняю в процедуре, передавая данные через переменные. Конечно 1С знает что там и откуда взялось. Другое дело, что не хочет сама прописывать эти типы в ТЗ
в момент заполнения, а корячить чужой код тоже не хочется.
на самом деле недолго. Передавать ТЗ с колонками неопределенных типов это колхоз и пережиток 7.7, т.к. по такой ТЗ невозможно составить индекс и любой поиск будет производиться перебором всех строк. Во временную таблицу опять же не поместить, т.к. для создания временной таблицы требуется описание типов в каждой колонке, или перебирать все пол миллиона строк, определять/запоминать тип каждого значения, и только потом создавать описание таблицы, что куда накладнее, нежели явно указать тип колонки и 1 раз считать его из указателя.
как она пропишет типы в ТЗ, если вы ей эти самые типы не указали? У колонки может быть составной тип, но ни одного значения(пока) одного из типов. При загрузке в движения/набор записей регистра, набор типов известен. Более того, если в регистре есть составной тип и приходит составной тип, то 1С сама сопоставит наборы типов и загрузит совпадающие.
вы передаете лишь указатель на ячейку памяти, содержащую определенное значение, что и откуда взялось 1С глубоко фиолетово.
Есть какой-нибудь способ принудить 1С не грузить все в память, а нагрузить больше файловую систему? Столкнулся с ошибкой "Недостаточно памяти" после того как 1С сьела всего-лишь 500Мб ОЗУ выполняя мои запросы. Очень уж не хочется менять архитектуру конфигурации, чтобы работать с ограниченным блоком данных и подгружать их постепенно.
(20) Xershi, есть ли в 1С возможность передать название функции/процедуры в качестве параметра, в качестве callback/функции обратного вызова? Например:
(23) Xershi, спасибо я уже сделал вариант применяемый со стандартными конфигурациями, с подключаемым оборудованием. Сделал несколько общих модулей по аналогии с классами, прописал там процедуры с одинаковыми названиями, а в другом общем модуле сделал функцию которая в качестве аргумента принимает имя перечисления, а возвращает нужный модуль(обработчик/хэндлер). Таким образом в одной и той же процедуре в зависимости от значения в перечислении выполняются разные обработчики. Если понадобится добавить еще один обработчик, то я его просто добавляю в общие модули и пишу реализацию, не меняя все процедуры конфигурации, где идет работа с обработчиками.
1С Предприятие это программный продукт который позволяет очень легко и быстро автоматизировать работу в какой либо организации. Сейчас наверно не возможно найти организацию в которой бы не использовалось какая либо конфигурация 1С. Поэтому уметь с ней работать должен каждый ИТ специалист даже начинающий. Необходимо обладать хотя бы навыками администрирование, подключение клинетов, настройка доступа, обновление и т.д. Так же нужно знать как решать самые элементарные ошибки которые возникают во время работы и запуска 1С. Таких ошибок достаточно много, о некоторых я уже рассказывал в следующих статьях, с которыми Вам обязательно нужно ознакомиться.
Сегодня рассмотрим еще одну, она возникает в момент запуска информационной базы которая опубликована на веб сервере.
Если нажать «Подробно» то можно увидеть.
Решить проблему можно отключив проверку, для этого выбираем базу и жмем «Изменить».
Потом нужно нажать «Дополнительно».
Первое окно пропускаем.
А в следующем выбираем «Не предоставлять сертификат» и «Не проверять сертификат сервера».
Теперь все должно запуститься, но помните что это не безопасно, так как есть вероятность перехвата данных.
21 апреля пользователи Сети начали сообщать о проблемах с работой всех сервисов 1С. Недоступны обновления, невозможно зайти в личный кабинет и на сервис ИТС, не работает ЭДО и 1С:отчётность. 25 числа необходимо подавать отчёт в налоговую, но его невозможно подготовить из-за сбоя.
В официальном Telegram-канале 1C:Франчайзи появилась информация, что доступ к сервисам пропал из-за DDoS-атаки на ресурсы 1С и часть сайтов компании.
По неподтверждённой информации, кроме 1C DDoS-атаке подверглись РАР и ФСС.
Информационная служба Хабра направила 1С запрос с просьбой дать официальный комментарий по ситуации. Как указали в компании:
«С 21 апреля происходят DDoS-атаки на различные сервисы для учёта и отчётности в организациях, в том числе на ресурсы 1С. Часть наших сайтов и сервисов была временно недоступна или работали медленно и неустойчиво. На данный момент восстановлено нормальное функционирование большинства интернет-ресурсов и сервисов 1С, включая 1С:ЭДО и 1С-Отчетность. DDoS-атаки продолжаются, технические специалисты 1С отслеживают ситуацию и принимают усилия для обеспечения нормального функционирования интернет-ресурсов и сервисов 1С. Угрозы для данных пользователей не наблюдается, они не пострадали и надёжно защищены».
Несмотря на заявление компании, пользователи Сети продолжают жаловаться на полное прекращение работы 1С. В частности, пользователь Хабра @nat_young рассказал, что со вчерашнего дня в работе сервисов практически ничего не изменилось.
Добрый вечер, встала такая задача, нужно чтобы заявки добавлялись определенное количество, вот создал Регистр сведений где определили количество заявок, написал код но почему то запрос не работаю, я могу добавить заявок сколько хочется, подскажите что не так
В консоли запросов в предприятии сначала проверяйте, как он работает, а потом уже помещайте в код.
И вообще, чтобы понимать, почему не работает запрос, - нужен пример таблицы с именами колонок и значениями
Сначала данные в Регистре нет, так как еще не было заявок. Что именно Вам показать?
Вы пишете, что не работает запрос: как вы поняли, что он не работает? работает ли запрос в режиме предприятия в консоли запросов? какие данные хранятся в вашем регистре? проверяли ли вы отладкой свой алгоритм?
Что то не понимаю, когда Параметры Дата убераю тогда все работает, а с ними нет
Значит РемонтныеЗаявки.Период не попадает в интервал МЕЖДУ ДатаНач И ДатаКон
При создании первого документа сначала в Регистре нет этого периода, по создание документ появляется с этим периодом, когда создаем второй документ запрос уже должен проверять и найти один документ, а он его не находит, почему?
Сделайте в предприятии скрин регистра сведений уже с записями первого документа и двух ваших документов
Я вроде понял в чем дело, можете подсказать как суммировать Ресурс если он имеет тип Перечисление? Или можно как сто суммировать Измерения
Количество(Ресурс) КАК Количество
Не тот использовал регистр. Переделал вот так, но почему то не срабатывает
Вам нужно отладчиком смотреть в вашей базе по шагам, только тогда вы поймете, почему не работает.
Сначала проверьте что возвращает запрос, потом - что возвращает функция по результату запроса, потом условие в обработке проведения, сами значения, которые в условии вы сравниваете, потом уже тело условия с движениями ну и т.д.
И "не срабатывает" что именно?
//Вот так попробуйте, должно сработать:Функция ПолучитьЗаявки(ЛицевойСчет,Статус) Запрос = Новый Запрос; Запрос.Текст ; Запрос.УстановитьПараметр("Маршрут",ЛицевойСчет.Участок);
Запрос.УстановитьПараметр("Маршрут",ЛицевойСчет.Участок);Запрос.УстановитьПараметр("ДатаНач",НачалоДня(Дата)); Запрос.УстановитьПараметр("ДатаКон",КонецДня(Дата));Возврат Запрос.Выполнить().Выгрузить(); КонецФункции
Пардон, забыл отформатировать Но вообще вижу 2 ошибки:1) в тексте запроса у параметров должен быть суффикс "&", например:
2) Функция НайтиСтроки(. ) возвращает массив, а не таблицу значений.
не имеет смысла.
Спасибо за помощь, я разобрался чтобы выводила Предупреждение("На этот день количество заявок закончились!"+Символы.ПС+"Выберите другую дату.");, но почему все равно добавляет?
Я заметил что он не записывает в регистр СтатусЗаявокНаРемонт и просто создает документ
Сделал так, не знаю правильно это или нет
Читайте также: