1с проверитьбит не определена
Методика расследования причин медленной работы операции на примере открытия управляемой формы
Для начала необходимо убедиться, что проблема стабильно воспроизводится (в одинаковых условиях) и что все пункты с описанием применения методики выполнены. Для этого можно сделать следующее:
Сбор и анализ стандартных данных
Разберем пример для операции открытия формы документа "Табель учёта рабочего времени".
Мы организовали тестовый стенд, на котором наша проблема воспроизводится под пользователем с полными правами. К этому стенду мы можем подключаться как напрямую с удаленной рабочей станции в режиме тонкого клиента, так и в режиме веб-клиента через публикацию на веб-сервере.
Настройка технологического журнала на клиенте может быть такой:
Фильтр по имени процесса для нашей задачи избыточен и нужен для того, чтобы в случае ошибочной настройки такого лога на сервере не получить сбор всех событий для серверных процессов, что может занять значительный объем. С другой стороны, при осознанном включении такой настройки на сервере (если клиентские приложения запускаются там же, где может быть развернут и сервер приложений 1С:Предприятие) мы в отдельном каталоге Client_Full увидим данные только клиентских приложений (хотя при этом подкаталоги других процессов тоже будут созданы, но они буду пустыми). Свойство Interface не собираем, так как оно дублируется более "человек читаемым" свойством IName (хотя даже последнее нам в данном примере не обязательно нужно).
После настройки технологических журналов и проверки корректности замера времени ОценкиПроизводительности БСП выполняем повторение операции с включенной отладкой.
Замеры времени средствами БСП будут выглядеть следующим образом:
Везде далее будем рассматривать верхний в этом списке замер от последнего повторения, его длительность 13,022 секунды.
Замер отладчиком конфигуратора изображен на следующем рисунке:
Как видно, сумма длительности всех строк, связанных с открытием формы составила всего 1,523 секунды.
'00010101' + ТекущаяУниверсальнаяДатаВМиллисекундах() / 1000
а для миллисекунд взять остаток от деления на 1000 (то есть просто последние три цифры, обратите внимание на "779" на следующей картинке).
Точное время начала замера (минут:секунд.миллисекунд): 25:10.779
Точное время окончания замера (минут:секунд.миллисекунд): 25:23.801
Найдем теперь записи технологического журнала, соответствующие данному замеру, они будут примерно следующими:
Здесь видно, что соответствующий нашему замеру серверный вызов SCALL завершился примерно за 10,1 секунды, это соответствует интервалу между запросом VRSREQUEST и ответом VRSRESPONSE.
Причем время начала замера почти совпадает с началом вызова, то есть событием VRSREQUEST, что собственно ожидаемо, так как замер БСП начинается на клиенте и должен быть непосредственно перед командой открытия формы. А вот окончание вызова сервера случилось раньше, чем окончание замера, что значит, что эта разница во времени пришлась на часть работы клиентского приложения.
Итак, промежуточный итог по длительностям замеров разными способами показывает соответствие нашей ситуации ограничениям и выполнение неравенства: 1,5 < 10,1 < 13.
Стандартными инструментами не удается увидеть причину проблем низкой производительности работы (открытия) управляемой формы, поэтому воспользуемся следующими помощниками:
- Отладчик операционной системы: Windows Performance Recorder для сбора метрик и Windows Performance Analyzer для их визуализации и анализа;
- Анализатор сетевых протоколов Wireshark или прокси-сервер Fiddler Web Debugger.
Установим и запустим Windows Performance Recorder ("C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\WPRUI.exe"), укажем настройки:
После того, как их подготовили, перейдем в тонкий клиент 1С, откроем форму списка документов и непосредственно перед воспроизведением проблемной операции запустим сбор данных WPR (кнопка Start).
После открытия формы в тонком клиенте запись можно остановить и открыть ее для анализа. В открывшемся окне найдем по PID 5508 (его можно определить в диспетчере задач ОС или по логам ТЖ) наш тонкий клиент 1С и должны получить примерно следующую картинку:
По данным Windows Performance Analyzer видим, что у нас нет серьезной нагрузки по дискам, а поток тонкого клиента потребляет 100% ЦП на протяжении длительного времени вплоть до завершения замера.
Запомним этот результат и проанализируем траффик.
Запустим Wireshark и повторим проблемную операцию в тонком клиенте 1С:Предприятие с прямым подключением к серверу приложений 1С.
При сборе данных с помощью Wireshark (и отбору по пакетам с сервером-источником равным серверу приложений 1С:Предприятие) запуск открытия формы документа будет выглядеть примерно так:
Здесь каждая такая строка – это пакет (или если точнее, то "кадр", frame), который в свою очередь является частью общего большого пакета поверх протокола TCP (PDU – Protocol Data Unit). Если их сложить, получим пакет около 70 Кб. Стоит обратить внимание, что это будет размер с учётом сжатия, а если без него – то должны получить что-то около 2500 – 3500 Кб данных.
Устанавливаем и запускаем Fiddler, на панели инструментов ищем "Browse", выбираем любимый браузер и запускаем в нем необходимое нам приложение (информационную базу 1С:Предприятие). После запуска переходим в форму списка документов (готовимся воспроизвести сценарий), возвращаемся в Fiddler и включаем сбор траффика (кнопка F12), переходим в браузер и открываем форму документа. После её открытия сбор траффика можно отключить и заняться его анализом. Мы должны получить примерно следующее:
В данном дампе достаточно быстро находится относительно большой пакет искомого размера, выбираем его в списке слева, а в правой части окна переключаемся на страницу Inspectors, выбираем там просмотр заголовков (Headers), и так как у нас пакет является сериализованным json (Content-Type: application/json), то попросим Fiddler десериализовать его для нас.
После этого в окне предпросмотра отобразится древовидная структура ответа (response), которая передается с сервера на клиент и содержит так много данных. Далее нам необходимо проанализировать её и найти наиболее проблемные места. Может помочь кнопка Expand All, которая развернёт все элементы дерева, но это может занять некоторое время. Чтобы его сократить, сначала поймем, что именно нужно искать.
Подведем промежуточный итог:
- Проблем с медленной работой прикладного кода 1С или запросов нет.
- Большая часть времени открытия формы состоит из сетевого взаимодействия.
- Размер пакета с формой подозрительно велик.
- После получения пакетов имеем высокую утилизацию ЦП тонким клиентом 1С (или веб-клиентом).
- Потерянное время находится где-то между окончанием/началом работы прикладного кода 1С и сетевой передачей.
Из всех этих пунктов для нас наиболее полезным и требующим дополнительного анализа является тезис "Размер пакета с формой подозрительно велик".
Какие могут быть причины для такой ситуации? В общем случае их несколько:
- Сама по себе большая и сложная форма с большим количеством экранных элементов и реквизитов. Наверное, редкий и точно не очень правильный случай, лучше такого избегать на этапе проектирования систем.
- Простая форма, но много данных в реквизитах формы (включая данные объекта), в особенности:
- Хранилище значения, Строка(0);
- Большие коллекции (Таблица, Дерево, Список);
- Произвольный тип (концентрация проблем).
Так как наша проблема (у вас может быть по-другому) воспроизводится даже при очень небольшом количестве данных в ТЧ, и реквизитов у документа (т.е. объекта формы) совсем не много, то их мы не рассматриваем. Остаются реквизиты формы, не равные основному реквизиту "Объект".
Среди них находится несколько реквизитов, имеющих произвольный тип. Могут выглядеть так:
Сопоставляем эти данные с уже собранным ранее замером с помощью конфигуратора, и видим заполнение этих структур достаточно большим количеством элементов (например, можно 5059 в реквизите "СвойстваИзмерений").
Снова вернемся к дампу траффика в Fiddler и найдем там элемент, отвечающий за параметры формы (response/props). Увидим там примерно следующее:И если развернем далее эти элементы, убедимся, что их там несколько тысяч, каждый из которых представляет собой вложенную структуру вида:
Найдем прикладной код, заполняющий эти параметры, и убедимся, что данных там действительно достаточно много (2-3 Мб), и они представляют собой большое количество сложных вложенных структур.
Отключив заполнение данных реквизитов, убеждаемся, что проблема с производительностью формы исчезает, что значит, что причина была найдена правильно.
Выводы и рекомендации
Длительная работа открытия формы обусловлена сериализацией и десериализацией больших коллекций значений при передаче их между клиентом и сервером.
Для того чтобы оценить степень влияния всех факторов, которые имеют значения в этом процессе, можно сделать несколько тестов (замеров), изменяя эти факторы и оценивая корреляцию их значений и длительности. В нашем случае причиной проблем были структуры, хранящие данные справочников территорий и условий труда, поэтому изменяли количество этих элементов и пробовали замерять передачу с клиента на сервер этих данных (процедура ДанныеДляРедактированияВХранилище).
В следующей таблице приведены результаты таких замеров в нашем примере. Сразу следует оговориться, что не стоит никаким образом рассматривать в ней абсолютные значения, так как это будет зависеть еще и от конфигурации компьютера, сети, версии платформы и многого другого, связанного именно с нашим примером. Для нас же важны зависимости и их характер (линейная, экспоненциальная и т.д.). Предлагаем вам проанализировать их самостоятельно (или даже повторить замеры на актуальной версии платформы в вашей среде).
Принимая во внимание полученные таким образом данные, можно предложить следующие возможные пути решения:
Начиная с версии платформы 8.3.11.2867 стал доступен ряд побитовых операций. Как это применимо в прикладной области, сложно сказать, но как это работает, понять можно. В этой публикации я не буду пересказывать теорию хранения данных в памяти, а лишь приведу тот минимум, который необходим для понимания публикации.
Теория
Под каждое число ОС выделяет определенный участок в памяти. Его размер зависит от типа числа. Платформа 1С сама заботится о типах - это называется динамической типизацией. Но если открыть синтакс-помощник и найти там например функцию ПобитовоеИ, то в описании сказано, что в качестве параметра может быть указано число в диапазоне 0 – 2^32-1 (4.294.967.295), что соответствует типу unsigned long int. Максимальный размер такого числа будет 32 бита (4 байта). Каждый бит в памяти может быть представлен 1 или 0. Число начинает формироваться начиная с самого правого бита (00000000000000000000000000000001 - 1 с типом unsigned long int в двоичной системе).
Практика
В качестве практики реализуем функцию, которая будет преобразовывать число из десятичной системы в двоичную, используя побитовые операции. Идея такого алгоритма в следующем - нужно проверить каждый бит числа на наличие в нем 0 или 1. Из полученных таким образом чисел, можно составить представление исходного числа в двоичной системе. Другими словами, каждый бит числа типа unsigned long int нужно сравнить с 1. Таких битов в числе этого типа 32, то есть можно использовать цикл. Ранее я привел пример того, как выглядит 1 в двоичной системе. То есть если в цикле передвигать первый бит начиная с самого старшего, то получится, что за время цикла 1 "побывает" в каждом из битов. Это можно назвать маской. В виде таблицы можно представить вот так:
Номер итерации Десятичное представление (1*2^НомерИтерации) Двоичное представление 31 2,147,483,648 10000000000000000000000000000000 . . . 3 8 00000000000000000000000000001000 2 4 00000000000000000000000000000100 1 2 00000000000000000000000000000010 0 1 00000000000000000000000000000001 Теперь на каждой итерации можно "сравнивать" биты исходного числа с десятичным числом из средней колонки таблицы. В случае полного совпадения битов (1-1 или 0-0) результат должен быть также 1 или 0, в противном случае всегда 0. В полученном таким образом числе, текущий бит (номер итерации) нужно сдвинуть вправо на количество битов, равное номеру итерации.
Описанный алгоритм реализуется средствами языка платформы 1С следующим образом:
Но, разработчики платформы сделали пару функций, которые облегчат решение данной задачи. В данном случае переменную OneOrZero можно получить следующим образом:
Но и это не все. В следующем примере даже нет необходимости вычислять маску:
Вместо заключения приведу еще один простой пример. Эта операция известна как swap. Кто не знает что это такое - обязательно запустите, будете удивлены.
P.s. Есть еще несколько функций платформы для работы с битами. Краткое их описание на зазеркалье.
Выходит ошибка
Управление автотранспортом Стандарт, редакция 2.0
[16.10.2018 8:55:25]: : Ошибка при вызове метода контекста (Создать): Ошибка инициализации модуля: ВнешняяОбработка.ЗащищеннаяОбработка.МодульОбъекта: : Процедура или функция с указанным именем уже определена (ПроверитьБит)Что можно сделать?
(7) Это УАТовская система защиты. Надо ломать сначала лицензионные модули, а потом искать откуда они эти модули получает.
(8) но буховский кусок конфигурации, не взирая на то, что в ней сидит УАТ у вас все-таки обновляют. Причем, насколько я сталкивался, если не прав, то поправьте - если вливался УАТ в конфиг с БП, то далее обновления этой соединенной конфиги получают уже от поставщика УАТ, а не с релизов 1С для БП
Файлы защиты для Управление Автотранспортом Стандарт, редакция 2.2, версия 2.2.1.1 может кто прислать?
Варианты:
1) снизить версию платформы до той, где нет этой функции
2) Снять модуль с поддержки и убрать саму функцию ПроверитьБит из модуля так как она теперь платформенная.
На Рарус надежды мало, ибо у них релизы раз в пол года по УАТ выходят(15) > снизить версию платформы до той, где нет этой функции
УАТ встроен в БП, для нового релиза БП снизить платформу не получится.
Была практически такая же проблема с УАТом, только с функциями работы с JSON.
Пришлось откатить платформу и запрашивать у поставщика свежий релиз.Ну еще можно в УАТе вырезать все вызовы защищенного модуля и надеяться что будет работать в полуобморочном состоянии. В УАТ 1 можно было безболезненно отучить почти везде кроме сложных расчетов рабочего времени и расхода ГСМ.
(20) Не будут работать очтеты УАТ все
+ не все документы будут открываться.
ТО есть УАТ как бы есть, но работать в нем не получится, тоже так себе решениеНу и что за чушь, относительно того, что нет релиза, нет релиза?
Управление автотранспортом Стандарт, редакция 2.1 2.2.1.1 25.09.18
Это в выпусках релизов ИТС - есть право на обновление, то обновляешься нормальным способом.
Обращаю внимание, что Дата выпуска релиза соотв. выпуску
Внимание! Текущая версия конфигурации "Бухгалтерия предприятия" предназначена для использования с версией технологической платформы 1С:Предприятие 8 не ниже 8.3.12.1529.
При обновлении 1С, уже в режиме “Предприятие”, вы можете столкнуться с такой ошибкой: “EF_’№…’: Процедура или функция с указанным именем не определена”.
Теория
Процесс обновления базы 1С я показывал в этой статье. Но бывает так, что в “Конфигураторе” обновление прошло без ошибок. Затем вы открываете базу в режиме “Предприятие” чтобы продолжить обновление. И как только согласитесь с легальностью полученных обновлений, вдруг видите следующую ошибку:
Может появиться и другая ошибка, без её описания. Тогда, чтобы понять что произошло, нажмите на ссылку “Сформировать отчет об ошибке“, а затем сохраните ошибку на ваш компьютер. Ошибка сохраниться в архиве в виде текстового файла, который вы можете открыть любым текстовым редактором. В этом текстовом файле можете найти ошибку из-за которой не обновляется база. И она может быть также связана с расширением, а может и ещё с чем-то. Но в этой статье мы рассматриваем именно определённую ошибку.
Эта ошибка означает что в базе есть расширение конфигурации, которое мешает обновиться. И номер этого расширения, в моём случае: “EF_00_00364434_5“. У вас может быть и другой номер, но начинается он всегда с EF_.
Расширения конфигурации – это специальный механизм, который нужен для доработки конфигурации без её изменения и без снятия её с поддержки. Типовые конфигурации, такие как “Бухгалтерия” или “Зарплата и управление персоналом” загружают расширения из интернета автоматически или вручную.
Кстати, расширения имеют больший приоритет, чем основная конфигурация. Поэтому и возникает данная ошибка. Расширение в обновлённой базе уже не нужно, но продолжает работать. И вот вам и ошибка “Процедура или функция с указанным именем не определена”.
Если у вас есть доступ к ИТС, то почитать про расширения можете тут.
В этом случае вам нужно просто удалить мешающее расширение используя “Конфигуратор“.
Удаление расширения
В конфигураторе вам следует перейти по следующим пунктам меню: “Конфигурация” / “Расширения конфигурации“:
И в открывшемся списке расширений находим нужное расширение и удаляем его:
Так как я уже удалил мешающее расширение, на рисунке выше его уже нет.
Далее нужно открыть базу в режиме “Предприятие” и попробовать продолжить обновление ещё раз. Больше этой ошибке у вас не должно появиться.
Успешных вам обновлений!
При обновлении 1С, уже в режиме "Предприятие", вы можете столкнуться с такой ошибкой: "EF_'. ': Процедура или функция с указанным именем не определена"
Универсальные переносы данных 1С (перенос документов, остатков и справочной информации):
Данные программы разработаны в нашей компании. Позволяют комфортно выполнить переход со старых программ 1С на новые. В отличие от типовых переносов фирмы 1С эти разработки позволяют переносить документы за выбранный период.
Переносы данных можно приобрести за безналичный расчет на юридическое лицо (предоставим закрывающие документы) или оплатить банковской картой через шлюз Яндекс.Кассы (предоставим электронный чек). -->Если речь идет о регистре, допустим, о пустом значении одного из его измерений, то в запросе поможет подобная инструкция:
Такой запрос поможет, если необходимо проверить на пустую ссылку измеренияДокументОприходования.
В некоторых случаях необходимо проверять на NULL не саму ссылку, а ее представление:
Рассмотрим другие способы проверки на битые ссылки на платформе 1С
Cпособ через конвертацию в строку:
Есть еще способ через функцию ПолучитьОбъект():
Это будет выполняться только в случае, если ссылка битая.
Способ через универсальную функцию, которая определяет для любого значения ссылки, является ли она битой
Есть вопросы по работе с 1С?
Читайте также: