Показаны сообщения с ярлыком Прочее. Показать все сообщения
Показаны сообщения с ярлыком Прочее. Показать все сообщения

среда, 28 октября 2015 г.

Как установить заголовок приложения(системы)

Надумал я немножко "попиарится". На одном известном форуме люди выкладывают свои решения экзаменационных задач к экзамену 1с специалист, но в подписи нельзя просто указать адрес сайта. Но всегда есть минимум 2 выхода). Решил эту задачу тем что адрес блога будет выводится в заголовке клиентского приложения. Таким образом если человек скачает решение он узнает и о блоге. (Есть конечно невнимательные люди могут и не увидеть) ).
Как это можно сделать.
1) В общем модуле "Общиймодуль1" с включенным признаком "ВызовСервера" прописываем функцию

Функция    ПолучитьСиноним() Экспорт;
ТекСиноним = Метаданные.Синоним;
Возврат ТекСиноним;
КонецФункции

2) В модуле управляемого приложения вставляем код
Процедура ПриНачалеРаботыСистемы()
    ТекЗаголовок = "learning1c.blogspot.com " ;
    ТекСиноним= ОбщийМодуль1.ПолучитьСиноним();
    НовЗаголовок =    ТекЗаголовок+ТекСиноним+ИмяПользователя() ;
    УстановитьЗаголовокКлиентскогоПриложения(НовЗаголовок);  
КонецПроцедуры

3) Устанавливаем сам заголовок в свойствах конфигурации.

Получаем требуемую картину

четверг, 22 октября 2015 г.

В данной транзакции уже происходили ошибки или попытка не пытка.


Рано или поздно каждому программисту 1с придется познакомится с сообщением об ошибке "В данной транзакции уже происходили ошибки".
В этой статье разберем природу этой ошибки.
Данная ошибка появляется при использовании конструкции Попытка... Исключение внутри транзакции. Дело в том, что если  исключительную ситуацию отрабатывать с помощью скобок Попытка...Исключение...КонецПопытки, расположенных внутри транзакции, то транзакция не завершится в момент возникновения исключительной ситуации, она дойдет до следующего обращения к данным — чтения или записи, продолжая при этом блокировать ресурсы, и откатится с сообщением: «В данной транзакции уже происходили ошибки!». 

НачатьТранзакцию();
//первая попытка
Попытка
Исключение
КонецПопытки;

//вторая попытка
Попытка
Исключение
КонецПопытки;

РезультатЗапроса = Запрос.Выполнить();
ЗафиксироватьТранзакцию();

В  схеме описанной выше ошибка возникнет в строке РезультатЗапроса = Запрос.Выполнить();
Первая неприятность заключается в том, что совершенно не понятно в какой из попыток выше приключилась ошибка, что затрудняет ее поиск и исправление ведь зачастую ОписаниеОшибки()  ничего не сообщает. Вторая неприятность заключается в том, что эти сообщения не могут вызывать положительных эмоций у пользователей, которые часто спешат поделится ими с руководством, а дальше Вы сами знаете).
Таким образом использование Попытка...Исключение... КонецПопытки в транзакции никоим образом не решает наших проблем. 
Поэтому следует по возможности хорошенько подумать как избежать вообще использования попыток в транзакции. 
В моей практике был подобный случай. Фоновые задания загружали в систему заказы от контрагентов. Поначалу мы легкомысленно использовали конструкцию Попытка...Исключение... КонецПопытки. В итоге загрузка спотыкалась, заказы не загружались, все нервничали. Изменить ситуацию удалось очень тщательным предварительным разбором файла перед загрузкой и в случае проблем отправление письма клиенту и на саппорт.
Если же без попытки ни как то следует отработав исключительную ситуацию, вызывать оператор ВызватьИсключение 
Описанное поведение системы позволяет говорить о том, что если возникает ситуация, когда внутри транзакций нужно использовать скобки
Попытка...Исключение... КонецПопытки, необходимо, отработав исключительную ситуацию, вызывать оператор ВызватьИсключение. В таком случае выполнение кода завершится в конце попытки и дальше не пойдет, таким образом пользователи не увидят ошибку «В данной транзакции уже происходили ошибки!». 
Однако не всегда ошибочная ситуация приведет к появлению такой ошибки, это зависит от того восстановимая ошибка случилась или нет. Например:
Попытка
а =6/0;
Исключение
КонецПопытки;
Не приведет к появлению ошибки «В данной транзакции уже происходили ошибки!».
а вот следующий код системе не сможет "прожевать" и ошибка появится.

СпрНом = Справочники.Товары.СоздатьЭлемент();
СпрНом.Код ="000001" // товар с таким кодом уже был создан ранее
Попытка
СпрНом.Записать();
Исключение
КонецПопытки;

Также не упущу возможность развеять один миф в плену которого я и сам находился.
Миф звучит так "Попытка Исключение организует неявную транзакцию". Причем это сообщение от одного весьма известного методиста на форуме.
На самом деле это не так. Никакой неявной транзакции Попытка Исключение не организует.
Подведем итоги:
1) Крайне нежелательно использовать конструкцию Попытка...Исключение... КонецПопытки в транзакции.
2) Если уж без этого не обойтись то использование оператора ВызватьИсключение уберет появление ошибки "В данной транзакции уже происходили ошибки".




пятница, 31 июля 2015 г.

Знакомство с технологическим журналом 1С


Не так давно открыл для себя нечто новое, оказывается есть технологический журнал (ТЖ). Что это за зверь такой и для чего он нужен попытаюсь ответить в этой статье.

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

  • при выполнении какого кода «падают» рабочие процессы сервера
  • какие запросы работают медленно и откуда они вызываются
  • Посмотреть были ли взаимоблокировки или блокировки по таймауту
  • и  многое другое.   

Что же собой представляет ТЖ? А представляет собой ТЖ совокупность текстовых файлов, хранящихся в указанном каталоге. 
Файлы эти можно разделить на 2 группы 

  • файлы дампа
  • файлы логов

Логи – это файлы с расширением log, где информация хранится в текстовом виде. 
Дампы – это файл с расширением mdmp, который содержит в себе содержимое оперативной памяти процесса на момент «падения» .  


Идем дальше. А в каком каталоге хранятся файлы ТЖ?. 
По умолчанию   ТЖ создается в каталоге:
 %USERPROFILE%\Local Settings\Application Data\1C\1Cv82\ 
Если используется Windows Vista и выше, то будет использоваться каталог: %LOCALAPPDATA%\1C\1Cv82\
Для 8.3 вместо каталога 1Cv82 используется 1Cv8.  

Но этот каталог можно изменить. Об этом чуть ниже.

Как включить ТЖ?
По умолчанию технологический журнал включен, и настроен на сохранение минимальных дампов. С помощью специального файла мы можем настроить ТЖ. А именно можем изменить каталоги ТЖ, указать какие события должны регистрироваться в ТЖ и тд.
Я говорю о файле настроек ТЖ logcfg.xml 
Этот файл должен находится в каталоге conf в папке с установленной 1с, например
«D:\Program Files\1Cv8\conf» 
Рассмотрим пример файла настроек для полного ТЖ.
config xmlns="http://v8.1c.ru/v8/tech-log">
    <log location="C:\Program Files\1cv82\logs" history="24">
        <event>
            <ne property="Name" value=""/>
        </event>
        <property name="all">
        </property>
    </log>
</config>

Этот конфигурационный файл определяет вывод в технологический журнал всех событий вместе со всеми свойствами. Журнал будет сохраняться в течение недели (24 часа). Однако объем выводимой информации при этом будет очень большим.
Целесообразней настроить ТЖ только на интересующие нас события, например мы хотим посмотреть есть были ли в системе ошибки и долгие операции (>10 секунд)

<config xmlns="http://v8.1c.ru/v8/tech-log">
    <log location="C:\Program Files\1cv82\logs" history="168">
        <event>
            <eq property="Name" value="PROC"/>
        </event>
        <event>
            <eq property="Name" value="SCOM"/>
        </event>
        <event>
            <eq property="Name" value="CONN"/>
        </event>
        <event>
            <eq property="Name" value="EXCP"/>
        </event>
        <event>
            <eq property="Name" value="ADMIN"/>
        </event>
        <event>
            <eq property="Name" value="QERR"/>
        </event>
        <event>
            <gt property="Duration" value="100000"/>
        </event>
        <property name="all">
        </property>
    </log>
</config>




Самые распространенные события ТЖ:
EXCP – исключительные ситуации приложений системы «1С:Предприятие», которые штатно не обрабатываются и могут послужить причиной̆ аварийного завершения серверного процесса или подсоединенного к нему клиентского процесса. 
EXCPCNTX – события, которые начались, но не закончились в момент возникновения нештатной̆ ситуации. 
DBMSSQL – исполнение операторов SQL СУБД Microsoft SQL Server. Для каждой СУБД используется свое событие (BPOSTGRS, DBORACLE, DB2, DBV8DBENG – файловый вариант) 
ADMIN – действия администратора кластера в консоли кластеров. 
PROC – события, относящиеся к процессу целиком и влияющие на дальнейшую работоспособность процесса. Например: старт, завершение, аварийное завершение и т. п. 
CALL – входящий удалённый вызов (удалённый вызов на стороне приемника вызова). Например, если вы из клиента вызываете функцию на сервере, то в ТЖ на сервере будет записано событие CALL.
SCALL – исходящий удалённый вызов (исходящий вызов на стороне источника вызова). Например, если вы из клиента вызываете функцию на сервере, то в ТЖ на клиенте будет записано событие SCALL.
SESN – действия, относящиеся к сеансу работы. Например: начало сеанса, окончание сеанса.  
TDEADLOCK – обнаружена взаимоблокировка в управляемом режиме блокировок.
TTIMEOUT – ошибка по таймауту на управляемых блокировках.
TLOCK – установка транзакционной блокировки в управляемом режиме блокировок.   

С помощью настроек ТЖ можно отфильтровать практически любые  интересующие нас события. 
Допустим хотим видеть в ТЖ только ошибки и информацию о запросах к таблице AccRg105, которые длились более 3 секунд. Тогда logcfg должен выглядеть следующим образом.   

Между двумя работает логическое ИЛИ, т.е. при возникновении любого из событий оно будет записано в ТЖ. 
Внутри одного работает логическое И , т.е. данное событие будет записано только в том случае, если будут выполнены все условия внутри одного . 
При такой настройке событие EXCP будет записываться всегда, а событие DBMSSQL только в том случае, если в любом месте текста запроса содержится строка «AccRg105» и при этом запрос выполнялся дольше 3 секунд. Фильтр на длительность события, надо ставить в десятитысячных долях секунды независимо от версии платформы. В данном примере мы используем несколько условий: eq, gt и like. 
Можно использовать следующие условия:

  • eq – равно; 
  • ne – не равно;
  • gt – больше;
  • ge – больше или равно; 
  • lt – меньше; 
  • le – меньше или равно;
  • like – соответствие маске.  

В окончании добавлю еще пару примечаний:
Платформа раз в минуту считывает данные из файла настроек, поэтому не стоит горячится и сразу проверять файлы, только спокойствие все будет через минуточку)
Если Вы не собираетесь посылать в фирму 1с данные дампов, то не зачем их и хранить, в файле настроек не указывайте строку dump location.
Если Вы собираетесь хранить файлы ТЖ в каталоге отличном от каталога по умолчанию, то лучше предварительно создайте его сами.

В тестовой базе я  умышленно создал превышение таймаута на блокировке,
На примере этого файла можете посмотреть как выглядит лог файл









Не работает отладка на сервере


В этой заметке я опишу как в 2 шага решить  вопрос отладки серверных процедур. Дело в том, что после того как мы (или админы) установили требуемое ПО на сервере, часто "на радостях" спешим развернуть базу и в процессе работы, и только обнаружив что отладчик не останавливается в точке останова исправляем ситуацию.
Делается это очень просто:

  1. Запускаем regedit  и добавляем ключ -debug  в ветке HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\1C:Enterprise 8.2 Server Agent\ для параметра ImagePath. 
Например было:

"C:\Program Files (x86)\1cv8\8.3.6.2076\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files (x86)\1cv8\srvinfo"

 стало:
"C:\Program Files (x86)\1cv8\8.3.6.2076\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -debug  -d "C:\Program Files (x86)\1cv8\srvinfo".

ВАЖНО: Не проморгайте один момент: перед -debug должен быть пробел, иначе можете проверить что будет)

2) Перезапускаем службу 1C:Enterprise 8.2 Server Agent

четверг, 30 июля 2015 г.

Особенности и недостатки временных таблиц


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

Без индексирования
 С индексированием
Серверная база
1.956
3.735
Файловая база
1.846
7.223

Отсюда вывод нужно индексы применять осознанно, а не лепить по принципу чем больше тем лучше)
Также интересно было узнать где хранятся ВТ.
Учту что желательно уничтожать ВТ методом МВТ.Закрыть().

Приглашаю  всех в группу в контакте



воскресенье, 19 июля 2015 г.

Получение сертификата 1с профессионал по программе Управление торговлей.

В пятницу 17.07.15 разжился еще одним сертификатом).
Срок подготовки 2 недели. Подготовка попала на интересное время, в которое фирма 1с потребовала закрыть онлайн тесты для подготовки к экзаменам. Где-то неделю тренировался на сайте http://manualus.ru, тесты на котором на моих глазах были прикрыты, перешел на сайт  http://1-exam.ru/ но удалось там потеститься всего 1-2 дня, опять же тесты на моих глазах в одночасье пропали. Пришлось переходить на сайт http://dist.edu.1c.ru/. Там большой минус в бесплатной версии не указываются правильные и неправильные ответы, зато через несколько дней мне даже выдали справку)
http://dist.edu.1c.ru/1CEduWeb/free_registration/sertificat.jsp?SertID=6299805481
и порекомендовали сдать на профессионала, что я и сам собирался сделать.


1с и Sql Error converting data type varchar to numeric

Столкнулся с данным сообщением при заполнении таблицы SQL данными из 1с.
В 1с колонка имеет тип "Число", в SQL естественно тоже, но при добавлении новой строки SQL понимает что число из 1С это Varchar и пытается преобразовать в число.
Нашел следующее решение:
С помощью функции преобразовать число к такому виду, которое SQL смогла бы преобразовать в число.

Функция ФорматироватьЧисло(Параметр)
Параметр1 = СтрЗаменить(Параметр,",",".");
Параметр2 = СтрЗаменить(Параметр1,Символы.НПП,"");
Возврат Параметр2;
КонецФункции