официальный партнёр 1С по деловому софту
Закрыть
Логин:
Пароль:
Забыли свой пароль?
  Войти
Войти как пользователь
Вы можете войти на сайт, если вы зарегистрированы на одном из этих сервисов:
 
8(495)229-30-42

Блог 1С Эксперта

  • Архив

    «   Март 2024   »
    Пн Вт Ср Чт Пт Сб Вс
            1 2 3
    4 5 6 7 8 9 10
    11 12 13 14 15 16 17
    18 19 20 21 22 23 24
    25 26 27 28 29 30 31
                 

Внедрение подсистемы оценки производительности в старые конфигурации без БСП

1. Скачиваем файл из вложения
2. Открываем конфигуратор анализируемой базы
3. Делаем "Сравнить/объединить с конфигурацией из файла...", указываем файл из п.1
4. Делаем "Отметить по подсистемам файла", отмечаем только ОценкаПроизводительности
5. В модуле сеанса дописываем в конец метода УстановитьЗначениеПараметраСеанса строки
// ОценкаПроизводительности
ОценкаПроизводительностиСлужебный.УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры);
// } 
Также для удобного доступа к настройкам подсистемы из обычного приложения можно вынести куда то в интерфейс (например на форму параметров учёта) 3 новых константы
Либо они будут доступны сразу в управляемом режиме
6. Обновляемся, входим в пользовательский режим (1С:Предприятие), заполняем настройки
  • Взводим константу ВыполнятьЗамерыПроизводительности, другие 2 заполняем тоже ненулевыми значениями
  • В коде вписываем по шаблонам из соседних публикаций места в коде для сбора данных
  • Для сбора данных на клиенте еще потребуется заполнить регистр НастройкиКлючевыхОпераций
7. Собираем данные, смотрим в управляемом режиме отчёты

PS Прикладываю также расширение, через которое также можно подключить эту подсистему, НО есть минусы
А. Замеры в журнале регистрации будут выглядеть криво
Б. В модуль сеанса всё равно придётся прописать нужные строки из пункта 5
В. Регламентное задание на очистку старых замеров добавить через расширение не получится, придётся через конфигурацию

Шаблон замера длительной операции через БСП

Замер длительной операции отличается от обычного наличием вложенных операций и возможностью указать количество данных, так как иногда важно отследить зависимость времени обработки ключевой операции от объёма обработанных данных
// &ЗамерДлительнойОперации {
ОписаниеЗамера = ОценкаПроизводительности.НачатьЗамерДлительнойОперации("ИмяДлительнойКлючевойОперации");

// начало цикла/шага
ОценкаПроизводительности.ЗафиксироватьЗамерДлительнойОперации(ОписаниеЗамера, КоличествоДанныхНаШаге, ОписаниеШагаИлиИтератораЦикла, КомментарийШага);
// конец цикла/шага

ОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(ОписаниеЗамера, КоличествоДанныхВсего, НеобязательноОписаниеФинальногоШага, КомментарийЗамера);
// }

Шаблон для обычного замера через БСП

// &ЗамерПроизводительности {
   ИмяКлючевойОперации = "ЧекККМ.WSПрокси.БонусныеКарты.ЗафиксироватьОплату";
   #Если Клиент Тогда    
   Замер = ОценкаПроизводительностиРТКлиент.НачатьЗамер(Ложь, ИмяКлючевойОперации);
   #КонецЕсли 
   #Если Сервер Тогда    
   ДатаНачалаЗамера = ОценкаПроизводительности.НачатьЗамерВремени();
   #КонецЕсли 
   
   // САМО ЧУДНОЕ ДЕЙСТВИЕ!
   
   #Если Клиент Тогда
   // РАСКОММЕНТИРОВАТЬ ДЛЯ КОММЕНТАРИЯ К ЗАМЕРУ [простите за каламбур] Если Замер<>Неопределено Тогда ОценкаПроизводительностиКлиент.УстановитьКомментарийЗамера(Замер.Идентификатор, КомментарийЗамера); КонецЕсли;       
   ОценкаПроизводительностиРТКлиент.ЗакончитьЗамер(Замер);
   #КонецЕсли 
   #Если Сервер Тогда    
   ОценкаПроизводительности.ЗакончитьЗамерВремени(ИмяКлючевойОперации, ДатаНачалаЗамера); // ВесЗамера = 1, Комментарий = Неопределено
   #КонецЕсли 
   // }

ВАЖНО:
1. Замер НаСервере выполняется независимо от регистра НастройкиКлючевыхОпераций
2. Нужно помнить, что в файловом режиме выполнятся обе конструкции, и "#Клиент", и "#Сервер"
3. НаКлиенте есть возможность установить произвольный комментарий к замеру, для этого раскомментируйте соответствующую строчку

Методика восстановления файловых баз на низком уровне

https://infostart.ru/public/182889/
Во вложении итоговая обработка с моими правками для 8.3 для лечения повреждения после динамического обновления

Инструкция коротко
1. Открыть приложенную обработку из управляемого приложения
2. Указать проблемную базу
3. Нажать "Очистить config save"
4. Прогнать проблемную базу через chdbfl.exe , вполне вероятно что при этом будет написано "Ошибок не обнаружено", несмотря на эту надпись - chdbfl.exe всё же что-то делает
5. Попробовать войти в конфигуратор проблемной базы, если всё ок - получится!

Если "умер" TEMPDB

Рабочий способ тут
https://www.xtivia.com/start-sql-server-lost-tempdb-data-files/

Программная работа с сетевыми картами

Иногда бывает нужно быстро активировать один сетевой адаптер, и отключить - другой
Программно это можно сделать так
В консоли CMD выполнить
wmic nic get name, index
чтоб получить индекс сетевого адаптера

wmic path win32_networkadapter where index=7 call disable
чтоб отключить ненужный (7 поменять на индекс отключаемой карты из п.1)

wmic path win32_networkadapter where index=15 call enable
чтоб включить нужный (15 поменять на индекс подключаемой карты из п.1)


Подробно этот и другие варианты здесь: https://vynesimozg.com/kak-otklyuchit-vklyuchit-setevoj-adapter-v-windows/

Версия MSSQL сервера запросом

Все подробности в 2 клика
--Version Number
select @@version

--Edition
select serverproperty('Edition')

--Service Pack
select serverproperty('ProductLevel')

--Version Number
select serverproperty('ProductVersion')

Как проверить успешно ли скопировался большой архив

Бывает, что большой архив базы копируется с одного сервера на другой через интернет.
Занимает время. При использовании обычного копирования, а не специальных утилит (вроде Resilio Sync) - по пути может повредиться. Обнаруживается это только при восстановлении.
Исходим из того, что на сервере-отправителе архив целый (живой, восстановимый).
Проверить идентичность бэкапа без восстановления (либо ДО восстановления, если копированием и восстановлением занимаются разные люди) можно с помощью сравнения хэшей (например, MD5) исходного и скопированного файлов.
Сделать это проще всего с помощью утилитыhttps://www.winmd5.com/

UPD В новых версиях Windows появилась возможность посчитать хэш с помощью стандартных функций
Для этого запускаем консоль cmd
И пишем команду
certutil -hashfile <имя_файла> md5
Для удобства имя файла можно перетащить из Проводника через drag-n-drop  

Как закодировать строку в Base64

Иногда при работе с web-сервисами требуется передать данные в закодированном в Base64 виде.
Сложность в том, что платформенные методы кодировки в base64 на входе не принимают строку, а только двоичные данные.
Соответственно, строку сперва необходимо превратить в двоичные данные, например через сохранение в файл.
Ниже пример кода - как именно сохранить текст в файл, чтобы правильно сработало преобразование

Функция Base64(ВходящаяСтрока)

   ВременныйФайл = ПолучитьИмяВременногоФайла("base64_txt");
   
   ЗаписьТекста = Новый ЗаписьТекста(ВременныйФайл, "CESU-8");
   ЗаписьТекста.Записать(ВходящаяСтрока);
   ЗаписьТекста.Закрыть();
   
   ДвоичныеДанные = Новый ДвоичныеДанные(ВременныйФайл);
   СтрокаBase64 = Base64Строка(ДвоичныеДанные);
   
   УдалитьФайлы(ВременныйФайл);
   
   Возврат СтрокаBase64;

КонецФункции  

http://1centerprise8.blogspot.com/2015/03/binary-data-base64.html

SQL. RAISEERROR вместо PRINT при выводе сообщений о статусе выполнения

При выполнении длинных скриптов в MSSQL-студии хочется наблюдать статус. Куда дошло, что происходит в данный момент, сколько осталось?
Для этого можно использовать оператор PRINT
Но у него есть одна крайне неприятная особенность. Выводит текст только когда уже скрипт выполнен. Частный случай: при выполнении команды GO, что по сути - то же самое.
То есть чтобы сразу увидеть текст - можно после PRINT вставить GO, и мгновенно увидим сообщение.
Но минус данного финта состоит в том, что при выполнении GO мы какбы намекает SQL что предыдущая часть скрипта уже отработала полностью, и он удаляет все перемененные, определённые через DECLARE, а это в некоторых случаях заставляет пренебречь выводом сообщений в пользу сохранения работоспособности скрипта.

Но выход есть, конструкция RAISERROR (и не спрашивайте, где еще одна Е :) )
С флагом WITH NOWAIT
Чуть сложней использовать из-за того, что текст сообщения нельзя собирать динамически при передаче в метод, но в целом даёт нужный результат

Подробней здесь
https://www.sqltheater.com/2017/09/12/stop-using-print/

Как получить админские права в базу 1С с сохранением списка и паролей пользователей

База должна быть на MSSQL, куда должен быть доступ
http://www.msav.ru/blog/1334-sbros-parolya-1s-pod-sql

При установке 8.2 ошибка "Windows Error: Ошибка исполнения функции"

В некоторых случаях после установки платформы 8.3 возникает потребность установить 8.2
И сделать это мешает ошибка в самом начале инсталляции "Windows Error: Ошибка исполнения функции"
("Error function execution")
Лечится легко:
Найти файл C:\ProgramData\1C\1CEStart\1CEStart.cfg
Открыть его блокнотом ("Run as administrator")
Удалить параметр ADMINISTRATIONFUNC=0
Сохранить файл
Установить 8.2
Источник решения

Дополнительно с картинками

.
https://workandrelax.ru/9-programmnoe-obespechenie/1s/73-1s-oshibka-windows-error-oshibka-ispolneniya-funktsii-pri-ustanovke-platformy-1s

MSSQL: текущие запросы, транзакции и их отмена

Иногда возникает желание посмотреть что именно сейчас делается в SQL: какие запросы выполняются и какие транзакции активны?

Сделать это можно следующим образом.

Текущие запросы, с их текстами
select session_id, status, wait_type, command, last_wait_type  
  , qt.text sql_text  
  , total_elapsed_time/1000 as [total_elapsed_time, sec],  
         wait_time/1000 as [wait_time, sec], (total_elapsed_time - wait_time)/1000 as [work_time, sec] , percent_complete 
    from sys.dm_exec_requests as qs  
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt  
    where session_id >= 50 and session_id <> @@spid -- чтоб исключить текущую сессию и этот запрос

Самая долгая транзакция
DBCC OPENTRAN 
Возвращает результаты в виде
Oldest active transaction:
   SPID (server process ID): 65
   UID (user ID) : -1
   Name          : user_transaction
   LSN           : (14627553:1424:2)
   Start time    : Mar 12 2018  5:25:34:807PM
   SID           : 0x01

Подробности транзакции по SPID
DECLARE @sqltext VARBINARY(128)
SELECT @sqltext = sql_handle
FROM sys.sysprocesses
WHERE spid = [SPID, полученный из DBCC OPENTRAN]
SELECT *
FROM sys.dm_exec_sql_text(@sqltext)
GO

Принудительно откатить транзакцию, можно убив процесс
KILL [SPID, полученный из DBCC OPENTRAN]

Как прикрепить базу MSSQL только при наличии файла MDF (без LDF)

На практике MSSQL DBA бывают случаи, когда необходимо прикрепить базу SQL и журнала транзакций нет.
ЛИБО лог очень вырос и никакой shrink не помогает уменьшить его размер (модель восстановления simple)
В этом случае, после закрытия всех транзакций, можно сделать Detach базы
После чего переместить-переименовать файл журнала транзакций, и attach-нуть базу следующим скриптом
EXEC sp_attach_single_file_db @dbname = 'dbname', 
   @physname = 'D:\path\db.mdf'
Если всё хорошо - получим сообщение вида
File activation failure. The physical file name "D:\path\db_log.ldf" may be incorrect.
New log file 'D:\path\db_log.LDF' was created.
SQL создаст пустой журнал транзакций на старом месте.
После чего старый лог можно удалить.

Данный способ не сработает, если в базе на момент отключения были неподтвержденные транзакции. В этом случае поможет план Б из статьи https://infostart.ru/public/277252/

Консоль управления агрегатами регистров накопления для обычного приложения

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

Может
  1. Включить/отключить использование итогов
  2. Включить/отключить использование агрегатов
  3. Перестроить сеть агрегатов по выбранному регистру
  4. Обновить агрегаты по выбранному регистру
  5. Выгрузить оптимальные агрегаты в XML-файл
  6. Основные методы определены в модуле объекта, при желании обработка может использоваться в регламентном задании для автоматического перестроения сети и обновления агрегатов.

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

Платформа 8.2.15.301.

Если на живых данных ведется активная разработка, и часто выполняется динамическое обновление конфигурации базы данных - велик риск словить ошибку "Нарушена целостность структуры конфигурации". Это означает полную неработоспособность. Не запускается ни конфигуратор, ни "предприятие".
Несмотря на исправное и частое создание копий средствами СУБД - это помогло лишь отчасти, так как с точки зрения SQL бэкапы без нарушений, а вот 1С их уже не открывает. И замечаешь это только уже когда всё сломалось.

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

А помогло спасти рабочую базу сегодня вот это
http://infostart.ru/public/80542/
Спасибо автору!
Ну и мне, что перепробовал массу вариантов :) Этот - в моем случае оказался самым рабочим, делюсь.
Страницы: 1 | 2 | След.