tag:blogger.com,1999:blog-77638169442060624032024-03-06T23:00:32.908+03:001С: ЗакоулкиМой опыт программирования в 1С, для всех, даром, и пусть никто не уйдет обиженным :)mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.comBlogger89125tag:blogger.com,1999:blog-7763816944206062403.post-85055161201997695792019-08-19T20:45:00.001+03:002019-08-19T20:45:46.069+03:00Визуализация каталога публикаций Infostart<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkzGznDIwJNqKKwUindp9JwUo6o2Ok3mw_5at_SxmCd7TzC_YQWqB1CyKxp0RsiurY-aIeVqm2hJMkpEC71Dho7yxPXnyeVna3aiXKpkNBHS8EVDNPuZ3-L5c9yCv4blWJxkBCgl5nCiZq/s1600/g4973.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkzGznDIwJNqKKwUindp9JwUo6o2Ok3mw_5at_SxmCd7TzC_YQWqB1CyKxp0RsiurY-aIeVqm2hJMkpEC71Dho7yxPXnyeVna3aiXKpkNBHS8EVDNPuZ3-L5c9yCv4blWJxkBCgl5nCiZq/s400/g4973.png" /></a>Просто оставлю это здесь. Захотелось проверить возможности утилиты <a href="https://gource.io/" target="_blank">gource.io</a>. Подходящего объема не было, а генерировать абстрактные данные было не интересно. В итоге решил спарсить <a href="https://infostart.ru/public/all/" target="_blank">каталог публикаций Инфострата</a>. А именно активность по странице - дата публикации или комментария и пользователя с привязкой к структуре каталога. Парсер написал на <a href="http://oscript.io/" target="_blank">OneScript</a> с использованием библиотек:<br />
<a href="http://hub.oscript.io/package/1connector" target="_blank">1connector</a> - получение текста страниц, текст страниц разбирался с помощью регулярных выражений;<br />
<a href="http://hub.oscript.io/package/sql" target="_blank">sql</a> - для работы с sqlite-базой, запись/чтение результатов парсинга.<br />
Сам скрипт выкладывать не буду, на вопросы отвечу.<br />
<br />
Записи визуализаций:<br />
<br />
<a name='more'></a><br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/qJrkjnRZaUw/0.jpg" frameborder="0" height="360" src="https://www.youtube.com/embed/qJrkjnRZaUw?feature=player_embedded" width="480"></iframe></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/d7hqvho_X2s/0.jpg" frameborder="0" height="360" src="https://www.youtube.com/embed/d7hqvho_X2s?feature=player_embedded" width="480"></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/XWv1IjkoH6E/0.jpg" frameborder="0" height="360" src="https://www.youtube.com/embed/XWv1IjkoH6E?feature=player_embedded" width="480"></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br /></div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com0tag:blogger.com,1999:blog-7763816944206062403.post-73723972266419280022019-03-18T09:16:00.000+03:002019-03-22T22:18:28.630+03:00Визуализация процесса разработки<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQVAu4RCXb13Oi5EezccQAMKLafjLIh36t6jxx8S1Jty5Obl_pTD7VrJIDiJ-IT2TL-MjM18xouZMZnyJUquVuAzMDoFO-ScD6DLvXb2CFRwctZavqCt4NjoPaDscRvskOgw9lcrfSkXic/s1600/g4973.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQVAu4RCXb13Oi5EezccQAMKLafjLIh36t6jxx8S1Jty5Obl_pTD7VrJIDiJ-IT2TL-MjM18xouZMZnyJUquVuAzMDoFO-ScD6DLvXb2CFRwctZavqCt4NjoPaDscRvskOgw9lcrfSkXic/s400/g4973.png" /></a>Полагаю, многие коллеги уже встречали ролики, в которых при помощи утилиты <a href="https://gource.io/" target="_blank">gource</a> выполняется красивая визуализация процесса разработки по истории изменений в системе контроля версий (git и подобные). Казалось бы, причем здесь мы, разработчики 1С? Большинство из нас вряд ли использует Git для разработки конфигураций. А притом, что отчет по истории хранилища тоже можно использовать, предварительно преобразовав в подходящий для утилиты <a href="https://github.com/acaudwell/Gource/wiki/Custom-Log-Format" target="_blank">формат</a>.<br />
<br />
<a name='more'></a>Для выгрузки журнала необходимо открыть пункт меню Конфигурация - Хранилище - История хранилища. Сохранить отчет по истории хранилища со следующими настройками:<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhibVT3o-a2L5MUmkvpAEzYMjw4BYDgLgDd11XOpOxF7KST6KZ9CBgAdYbE0LK-naiN88KdAAYZJSWmAtVLWBikrcTKuV1ps3E4C_ExH8YpdALUMD5-D4G-BqoOaiiGSIC9Mj0zOjnDI2UF/s1600/00001.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhibVT3o-a2L5MUmkvpAEzYMjw4BYDgLgDd11XOpOxF7KST6KZ9CBgAdYbE0LK-naiN88KdAAYZJSWmAtVLWBikrcTKuV1ps3E4C_ExH8YpdALUMD5-D4G-BqoOaiiGSIC9Mj0zOjnDI2UF/s1600/00001.png" /></a></div>
<br />
Полученный текстовый файл необходимо преобразовать в формат:<br />
<a href="https://en.wikipedia.org/wiki/Unix_time" target="_blank">МеткаВремени</a> | Пользователь | ТипДействия | ПутьКОбъекту | Цвет (при необходимости)<br />
<br />
МеткаВремени = ДатаВремяКоммита - Дата(1970, 1, 1)<br />
<br />
ТипДействия:<br />
- A = объекты группы Добавлено;<br />
- M = Изменено;<br />
- D = Удалено.<br />
<br />
ПутьКОбъекту - заменяем разделители "." на "/".<br />
<br />
Для форматирования журнала я разработал скрипт на <a href="http://oscript.io/" target="_blank">1Script</a>. Причина - наличие возможности работы с регулярными выражениями из коробки, без применения com-объекта VBScript.RegExp. Изначально хотел написать обработку, но по ходу разработки увидел возможность наложить регулярки на содержимое файла. Скрипт доступен в публикации на <a href="https://infostart.ru/public/1023033/" target="_blank">Инфостарте</a>, а так же на <a href="https://github.com/mickey1cx/1c_repolog_to_gource_open" target="_blank">Github</a>.<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Данные за три года по четырем проектам 1C: ERP:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/ZGlYvoVEYRA/0.jpg" frameborder="0" height="426" src="https://www.youtube.com/embed/ZGlYvoVEYRA?feature=player_embedded" width="512"></iframe></div>
<br />
Те же проекты, история взята из Git. Я экспериментировал с выгрузкой проектов с помощью <a href="https://its.1c.ru/db/metod8dev#content:5937:hdoc" target="_blank">1С:ГитКонвертер</a> для выполнения code review с использованием <a href="https://www.jetbrains.com/upsource/" target="_blank">Upsource</a>. Проекты выгружались с определенной версии, поэтому будет некоторое несоответствие с первым видео.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/BsiPpz0adRs/0.jpg" frameborder="0" height="426" src="https://www.youtube.com/embed/BsiPpz0adRs?feature=player_embedded" width="512"></iframe></div>
</div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com0tag:blogger.com,1999:blog-7763816944206062403.post-69154908948751718182019-01-27T23:05:00.000+03:002019-01-31T09:09:54.638+03:00Роль в памяти<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEMjJulnt9l3znLazIG08wug0YRMQ_FUJQD_HQoSU_6DwEmNbEmZt4G-U7ko2TQFCbPD0w2wrc-MbEZQbyorjUDgOQw_X5LtepzGhbCSI2qo5_umdt_oY3dUM3v1PyLnPJyoUscLzAmFSc/s1600/preview.png" imageanchor="1" style="clear: left; display: inline !important; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEMjJulnt9l3znLazIG08wug0YRMQ_FUJQD_HQoSU_6DwEmNbEmZt4G-U7ko2TQFCbPD0w2wrc-MbEZQbyorjUDgOQw_X5LtepzGhbCSI2qo5_umdt_oY3dUM3v1PyLnPJyoUscLzAmFSc/s400/preview.png" /></a>На днях получилось решить интересный кейс по оптимизации. Забегая вперед, скажу, что никогда бы не подумал, что выявленная причина может влиять на потребляемые ресурсы. Более того, полагаю, что и сам мог когда то так косячить с настройками. <br />
<br />
Но обо всем по порядку. Больной - конфигурация ERP 2.4, симптомы - конфигуратор и процессы rphost потребляют подозрительно много памяти. При этом оказалось, что проблема от пользовательских данных особо не зависит.<br />
Ок, развернул тестовый стенд на виртуалке и начал изучать пациента.<br />
<br />
<a name='more'></a><br />
В конфигураторе рост потребления памяти начинается при открытии любой формы.<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX1ieKI9l-wfDnNXMaC0IvAZMKZwCc-4CatvkVR_ZlT5dy4lAZz9pKKIBreaErJerU9o4WB6SjC2G5TxA-kcdZ9gBJegBv3pfpyJXU8HcKCycTTqJsH9AP1sjTYXNNCqYKilpSd8T1xK8O/s1600/00009-2.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX1ieKI9l-wfDnNXMaC0IvAZMKZwCc-4CatvkVR_ZlT5dy4lAZz9pKKIBreaErJerU9o4WB6SjC2G5TxA-kcdZ9gBJegBv3pfpyJXU8HcKCycTTqJsH9AP1sjTYXNNCqYKilpSd8T1xK8O/s1600/00009-2.png" /></a></div>
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj71C9ALQMOaA5uS_a-Wywh8ODa9x-OJS1Yq2oop3tRE4brj6c4v-kTN5G4HiCEE4yiyikfL2cTApTvstexy5NqLtBVFuOUna9SKGJSypvrMFpXlIWeRpeYZQGCh6KocMI6A5C7h3ya3ErW/s1600/00009-3.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj71C9ALQMOaA5uS_a-Wywh8ODa9x-OJS1Yq2oop3tRE4brj6c4v-kTN5G4HiCEE4yiyikfL2cTApTvstexy5NqLtBVFuOUna9SKGJSypvrMFpXlIWeRpeYZQGCh6KocMI6A5C7h3ya3ErW/s1600/00009-3.png" /></a></div>
<br />
Для rphost при первом клиентском подключении.<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheTykWYHIwKXIsK4s_pvBdcozxVGvF3PenR9_x8AEDCE0-jq1pl27TbGWuYmGqssOMXqgnwW5hEw61Tk-mG84FXkmzF-uC_Y2yIjm2b8oq86awz9nJDnDs48edNrYav-XKK4s6CzXehYvq/s1600/00009-1.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheTykWYHIwKXIsK4s_pvBdcozxVGvF3PenR9_x8AEDCE0-jq1pl27TbGWuYmGqssOMXqgnwW5hEw61Tk-mG84FXkmzF-uC_Y2yIjm2b8oq86awz9nJDnDs48edNrYav-XKK4s6CzXehYvq/s1600/00009-1.png" /></a></div>
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsg8SupfUZwuQDaKM7fH4O9JaUJJYcDoE5laiEx8uYMpbApIpBEdDcBgmaX00-7BkaAjlTzreVHlSAZ7okqENqEkBsNNGPufX3ZgsU9MaM5PjwMkxwgPy63oWuUcyqH8LVnMiToLnTAGfW/s1600/00009-4.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsg8SupfUZwuQDaKM7fH4O9JaUJJYcDoE5laiEx8uYMpbApIpBEdDcBgmaX00-7BkaAjlTzreVHlSAZ7okqENqEkBsNNGPufX3ZgsU9MaM5PjwMkxwgPy63oWuUcyqH8LVnMiToLnTAGfW/s1600/00009-4.png" /></a></div>
<br />
Поскольку конфигуратор тоже потреблял память, было решено проверить гипотезу, что проблема находится где то в метаданных. Была развернута типовая конфигурация, включена возможность изменений, открыта произвольная форма и зафиксированы начальные показатели.<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_hjZu9Y4MubOtYa7UbNZP-RSzl_E-9trRnpEU31umcrtzzstYi4tCvdekMdelv77Fx5hqUwkeDfpNDbydrJRpJF0irsEwbwPuTy6fkbexGu-iR5u01Ef3SxgHafJrVJ70Ez9aQh-x4LBf/s1600/00012.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_hjZu9Y4MubOtYa7UbNZP-RSzl_E-9trRnpEU31umcrtzzstYi4tCvdekMdelv77Fx5hqUwkeDfpNDbydrJRpJF0irsEwbwPuTy6fkbexGu-iR5u01Ef3SxgHafJrVJ70Ez9aQh-x4LBf/s1600/00012.png" /></a></div>
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDJn5sA82z3wYXKc0D0dRY0Gi5riv9qs3ZuA-acG_unz5dIuc8Ghfx1ztmJ2rh0HQtWyUEdiM7vJUGT5R5gXiRL95ULqB-ijJrCeHgvA2BntGzwg2zZZOrmqvyneZetvcqEsrCQIL8jQcP/s1600/00013.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDJn5sA82z3wYXKc0D0dRY0Gi5riv9qs3ZuA-acG_unz5dIuc8Ghfx1ztmJ2rh0HQtWyUEdiM7vJUGT5R5gXiRL95ULqB-ijJrCeHgvA2BntGzwg2zZZOrmqvyneZetvcqEsrCQIL8jQcP/s1600/00013.png" /></a></div>
<br />
После чего последовательно начал подтягивать добавленные при доработке объекты по типам. Сначала были загружены перечисления, справочники, документы и только после добавления ролей был получен похожий эффект потребления памяти.<br />
<br />
Первый анализ добавленных ролей явных проблем не выявил - роль выдана на конкретный объект конфигурации, ничего лишнего. Поэтому на следующем этапе решил посмотреть как выглядят добавленные роли после выгрузки конфигурации в файлы. Оказалось, выгруженные роли занимают более 50% от объема файлов всей конфигурации, а среди файлов ролей есть 237 файлов по 20 Мб, общим объемом 4,42 Гб.<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBpktGpvUdj2PILpseqzaIk2PVgQUjjKjNgb1fAToIUfv9X39kiTm_8YBbFtYNHK0mzy05LkHiOUg3zC750YUKIhksAInQ8TJgqOwaSyGw_MVCP6nkDqKLzaqUNV3BvneAxSUXuxANvbhx/s1600/00003.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBpktGpvUdj2PILpseqzaIk2PVgQUjjKjNgb1fAToIUfv9X39kiTm_8YBbFtYNHK0mzy05LkHiOUg3zC750YUKIhksAInQ8TJgqOwaSyGw_MVCP6nkDqKLzaqUNV3BvneAxSUXuxANvbhx/s1600/00003.png" /></a></div>
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl1dLP8CGvhPwyu4hGKVMtOFe90p1bZxpsQvGb3JAF2I9ayYDksKw9f-yd7gnKBw6_Egvbds4tkkDFhcYMiuOv0-fonIVDCTFrDQZgwJ8ie29W8BNbps4qrbtBDXar_TXe4OyqQYse1USD/s1600/00002.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl1dLP8CGvhPwyu4hGKVMtOFe90p1bZxpsQvGb3JAF2I9ayYDksKw9f-yd7gnKBw6_Egvbds4tkkDFhcYMiuOv0-fonIVDCTFrDQZgwJ8ie29W8BNbps4qrbtBDXar_TXe4OyqQYse1USD/s1600/00002.png" /></a></div>
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYyl6tNmars3K3MbonD8qqxrMfldlnU99bnjsWzqyslXRJWAEe_-JNEdyNjABwtiro6H_zXG71zEo7BVSZxk2I1OtbX4qA9zlbCSPrF9HPF1hpGFz0-klhpDl5-UjrdCMfvPGp9yc0tfkG/s1600/00001.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYyl6tNmars3K3MbonD8qqxrMfldlnU99bnjsWzqyslXRJWAEe_-JNEdyNjABwtiro6H_zXG71zEo7BVSZxk2I1OtbX4qA9zlbCSPrF9HPF1hpGFz0-klhpDl5-UjrdCMfvPGp9yc0tfkG/s1600/00001.png" /></a></div>
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHjyitNPmpUqjtyjC-1qTwFH29GOyL0teqRyqzhPrgUA56ckEEPpD6oUAEXZGt32vMBOeT7pYTZ6NG6jYBB57rPYkR-Uurc0pJvtLaUOqFpFSIxKWlEvfp2QDSFaYvAc5JQY8EPVAL6qwN/s1600/00005.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHjyitNPmpUqjtyjC-1qTwFH29GOyL0teqRyqzhPrgUA56ckEEPpD6oUAEXZGt32vMBOeT7pYTZ6NG6jYBB57rPYkR-Uurc0pJvtLaUOqFpFSIxKWlEvfp2QDSFaYvAc5JQY8EPVAL6qwN/s1600/00005.png" /></a></div>
<br />
После изучения первого попавшегося файла все встало на свои места и мне удалось повторить порядок действий и создать роль, которая при выгрузке имеет такой же большой объем. Как оказалось, у всех ролей при создании включена настройка "Устанавливать права для реквизитов и табличных частей по умолчанию", и у проблемной роли права на реквизиты прочих объектов не установлены. Что бы сделать такую роль, необходимо после создания выполнить "Действия" - "Снять все права", оставив все остальные настройки без изменения, после чего продолжить настройку нужных прав.<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpeydSKC_QOQhjHNjEI0YdbJuuauqMEpzmbMdO1Wm7OuxhqaMygooaAIWwDZsSI2fnuiU3Lrv-1m2_S9PugIqUMmmWkZ-7avVeGTlLCVi8Gl1kKQdzeT51xKUqJGc7aadCQ-gZcyknZpHM/s1600/00014-3.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpeydSKC_QOQhjHNjEI0YdbJuuauqMEpzmbMdO1Wm7OuxhqaMygooaAIWwDZsSI2fnuiU3Lrv-1m2_S9PugIqUMmmWkZ-7avVeGTlLCVi8Gl1kKQdzeT51xKUqJGc7aadCQ-gZcyknZpHM/s1600/00014-3.png" /></a></div>
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsNJ3A9WJ7gSumkbyk5wU2TU2c_pdfcHsrGvhvTRNuKtdaAOvgclFbcV2QYXktvD2prIyehL3tF7FTyIE1GGRspSADjMwj89SkIDvVnxiuNcL4mdSKxq0gVwedS1HWGsQ59OpOul1i3pIj/s1600/00014-1.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsNJ3A9WJ7gSumkbyk5wU2TU2c_pdfcHsrGvhvTRNuKtdaAOvgclFbcV2QYXktvD2prIyehL3tF7FTyIE1GGRspSADjMwj89SkIDvVnxiuNcL4mdSKxq0gVwedS1HWGsQ59OpOul1i3pIj/s1600/00014-1.png" /></a></div>
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQV-KujEDjrHdZqDytJuAblD78Hi8j1llg5fnjXCmbsJJiR0OQyDdNgh5qojhFMagoKnfcp248VSOjvGO4KdcYXwVSrGtd27S_bN1aY0S5RsuwXqNGpdKCtNrrQ2UJwdjYsIY-bBztF6Ap/s1600/00014-2.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQV-KujEDjrHdZqDytJuAblD78Hi8j1llg5fnjXCmbsJJiR0OQyDdNgh5qojhFMagoKnfcp248VSOjvGO4KdcYXwVSrGtd27S_bN1aY0S5RsuwXqNGpdKCtNrrQ2UJwdjYsIY-bBztF6Ap/s1600/00014-2.png" /></a></div>
<br />
В итоге у такой роли помимо настроек объекта прав для каждого реквизита всех остальных объектов конфигурации в XML-файле установлено значение false, что в итоге приводит к подобному объему файла.<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0z69oW977GrRCu1Prehgc2EHX90GmnQ1fs9s69zoI4dVCPsHSkew41JuLIHhdmQevoQSmNCZ2GYthm5ZKimyhbEXfmpP2BVYXHSeGCOPXUOKz0mgsNZLDBl6jO5YxcNDedUjHKK5_J3gd/s1600/00015.png" imageanchor="1"><img border="0" height="347" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0z69oW977GrRCu1Prehgc2EHX90GmnQ1fs9s69zoI4dVCPsHSkew41JuLIHhdmQevoQSmNCZ2GYthm5ZKimyhbEXfmpP2BVYXHSeGCOPXUOKz0mgsNZLDBl6jO5YxcNDedUjHKK5_J3gd/s640/00015.png" width="640" /></a></div>
<br />
Соответственно, при открытии формы в конфигураторе, либо при первом подключении все эти объемы подтягиваются в процессы. Чтобы исправить роль, необходимо выключить и включить настройку "Устанавливать права для реквизитов и табличных частей по умолчанию". После изменения всех проблемных ролей потребление памяти значительно сократилось.<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUssWPRtGeXPF-ygQZXXo5oMdoxI2uedODU8WzPS2S-HoLs2vqfJJdA7gRm6khGIVAWjUGDK1aHc0B2Won60jYeEArqrsxx5SjLZMI46X2VjGA_lKd2ZlT8Pf5lHFKvkdgXI_dk0tjKanH/s1600/00016-1.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUssWPRtGeXPF-ygQZXXo5oMdoxI2uedODU8WzPS2S-HoLs2vqfJJdA7gRm6khGIVAWjUGDK1aHc0B2Won60jYeEArqrsxx5SjLZMI46X2VjGA_lKd2ZlT8Pf5lHFKvkdgXI_dk0tjKanH/s1600/00016-1.png" /></a></div>
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjyWLa9b9BEaEd-FQr2Z1n6K7oQateh7dgdyVxB-2UoIE8fY0vnfP2vw8_ZD38rg12ZH8jKXgKVmeGwzZqpb3sEIPQDfhr_aMl2yTTHK7Y1kr7cRDIhZhyphenhypheno42UZbWnNkDoc7sLa-ZSno_4/s1600/00016-2.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjyWLa9b9BEaEd-FQr2Z1n6K7oQateh7dgdyVxB-2UoIE8fY0vnfP2vw8_ZD38rg12ZH8jKXgKVmeGwzZqpb3sEIPQDfhr_aMl2yTTHK7Y1kr7cRDIhZhyphenhypheno42UZbWnNkDoc7sLa-ZSno_4/s1600/00016-2.png" /></a></div>
<br />
Статья так же опубликована на <a href="https://infostart.ru/public/991247/" target="_blank">Инфостарте</a>.</div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com3tag:blogger.com,1999:blog-7763816944206062403.post-79879739107108121222018-09-13T09:55:00.000+03:002018-09-13T09:55:31.215+03:00С днем программиста<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJWOh87WxQPcws-OKnrhPGSm5-a10J_tL8Efg7oJ5l4TVI1pCMecCXx4oNM5hvKW_d15rAIvNdkSU5mD5v6KLGmxW5okSvBes6XAMWnhkSyGotZZEfAacH_5-DgD4QhejLvZiBeAghwThw/s1600/tumblr_odgbl2kEDj1qgng5qo1_1280.png" imageanchor="1"><img border="0" height="417" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJWOh87WxQPcws-OKnrhPGSm5-a10J_tL8Efg7oJ5l4TVI1pCMecCXx4oNM5hvKW_d15rAIvNdkSU5mD5v6KLGmxW5okSvBes6XAMWnhkSyGotZZEfAacH_5-DgD4QhejLvZiBeAghwThw/s640/tumblr_odgbl2kEDj1qgng5qo1_1280.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/XYpIeOexY3A/0.jpg" frameborder="0" height="400" src="https://www.youtube.com/embed/XYpIeOexY3A?feature=player_embedded" width="480"></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: center;">
<a href="https://www.youtube.com/playlist?list=PLFC_7ORS48fkxQn-khgsLjdHlR29bAhfX" target="_blank">И прочие клипы</a></div>
</div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com1tag:blogger.com,1999:blog-7763816944206062403.post-4705487794847025692018-09-03T17:29:00.001+03:002018-09-03T17:29:20.850+03:00Сервис "1С:Облачная карта прикладных решений"<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
Наткнулся на партнерке 1С на интересный сервис. Содержит описание функциональных возможностей типовых решений фирмы "1С", входящих в состав комплексной поставки "1С:Корпорация", а так же отраслевых и специализированных решений, расширяющих возможности 1С:ERP.<br />
<br />
<a href="http://platform.demo.1c.ru/solutionscloud">http://platform.demo.1c.ru/solutionscloud</a><br />
<br />
Функциональная модель разработана в соответствии с методологией IDEF0.<br />
<br />
<a href="https://1c.ru/news/info.jsp?id=21592" target="_blank">Источник</a><br />
<a href="http://video2-gpt-msk.1c.ru/services/get/155e8f00a39fffffffff5baa242.mp4" target="_blank">Запись вебинара по использованию сервиса</a><br />
<br />
Презентации вебинара:<br />
<a href="http://v8.1c.ru/UserFiles/Image/solutions/cloud/01_Koncepcia_modul_nogo_podhoda_v_reseniah_na_baze_1SERP.pdf" target="_blank">01 Концепция модульного подхода в решениях на базе 1СERP</a><br />
<a href="http://v8.1c.ru/UserFiles/Image/solutions/cloud/02_Servis_1S_Oblacnaa_karta_reseniy.pdf" target="_blank">02 Сервис 1С_Облачная карта решений</a><br />
<a href="http://v8.1c.ru/UserFiles/Image/solutions/cloud/03_1S_Oblacnaa_karta_reseniy_pri_vnedrenii.pdf" target="_blank">03 1С_Облачная карта решений при внедрении</a></div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com0tag:blogger.com,1999:blog-7763816944206062403.post-30524822628900566332018-08-14T17:56:00.001+03:002018-10-29T15:32:55.890+03:00Нужно больше практики<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDsEsSCJh_eQbXuM1-dBGupGnAUgv_iGlXMTu2-pcyY8OV3rucfjC4H9HPPwzLvtPWg-ayr4ClDQOrW0F9burztAlc69ZkpJPTQZlYgWmSok2AoiLDDmD6cvkq6gI2He32Is6aNRNnibL4/s1600/00001-1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDsEsSCJh_eQbXuM1-dBGupGnAUgv_iGlXMTu2-pcyY8OV3rucfjC4H9HPPwzLvtPWg-ayr4ClDQOrW0F9burztAlc69ZkpJPTQZlYgWmSok2AoiLDDmD6cvkq6gI2He32Is6aNRNnibL4/s400/00001-1.jpg" /></a><strike>Курсы курсами, а вот практики в решении проблем технологического характера очень не хватает. Возможно кто-то из вас сможет помочь с моей бедой. Поэтому решил провести эксперимент - прием заявок на диагностику проблем производительности. Для участия необходимо перейти по ссылке "Ускорение 1С" в шапке блога и зарегистрировать обращение.</strike><br />
<strike><br /></strike>
<strike>Предполагается следующий формат:</strike><br />
<strike>- до четырех часов безвозмездной работы по вашей проблеме;</strike><br />
<strike>- основные работы будут проводиться по вечерам или в выходные;</strike><br />
<strike>- отчет будет опубликован в блоге.</strike><br />
<strike><br /></strike>
<strike>Пока в планах отработать первые пять-семь заявок, дальше будет проведен анализ эффективности и востребованности подобного формата. Вопросы в комментариях приветствуются.</strike></div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com4tag:blogger.com,1999:blog-7763816944206062403.post-91474752749413922442018-07-17T00:12:00.000+03:002018-07-18T09:08:04.047+03:00Расширяй и властвуй: редактирование обработчиков КД 3.0 в VS Code<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimQKSDiCSSEwmPFdlxA5-_dNjZsxW-XpOYCFKX1cd6xT_3ls1w4UAYgPaX8072-HZxbxN7iozsZANGy7JrxrHejs9eNJ4YrzHF7v9twrAyqAB1mqcd2aGw4o7bVTWBkmkf6bJQ06xW4Qt7/s1600/241px-Visual_Studio_Code_1.18_icon.svg.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimQKSDiCSSEwmPFdlxA5-_dNjZsxW-XpOYCFKX1cd6xT_3ls1w4UAYgPaX8072-HZxbxN7iozsZANGy7JrxrHejs9eNJ4YrzHF7v9twrAyqAB1mqcd2aGw4o7bVTWBkmkf6bJQ06xW4Qt7/s400/241px-Visual_Studio_Code_1.18_icon.svg.png" /></a></div>
Решил было на днях пощупать Конвертацию Данных 3.0. Столкнулся с неудобством просмотра кода обработчиков из-за отсутствия подсветки. Порой приходилось делать копипаст текста в конфигуратор и анализировать там. Естественно, возникла потребность убрать лишние действия, в идеале сократив их до одного. После небольшого прототипирования на роль внешнего редактора был выбран <a href="https://code.visualstudio.com/" target="_blank">Visual Studio Code</a> из-за наличия <a href="https://marketplace.visualstudio.com/items?itemName=xDrivenDevelopment.language-1c-bsl" target="_blank">расширения</a> для файлов 1С (bsl).<br />
<a name='more'></a><br />
Разработка реализована через механизм расширений, в стиле Одной-Кнопки-Для-Управления-Всем. Редактор должен быть зарегистрирован как приложение по умолчанию для файлов bsl.<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeduYic8Ma_3_z0Uym9tFGqICN2W5dgDNPcZLz-sNPPnzyyN2APVDUCx4jHvA8PJeZaPAGHfb8s_fNLUTIoUf0v0Isgg1UG9sGqwYG6f5vxrcsyIBISSR-gYBoeDcHW4TpaElu7bXY5Ztv/s1600/00001.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeduYic8Ma_3_z0Uym9tFGqICN2W5dgDNPcZLz-sNPPnzyyN2APVDUCx4jHvA8PJeZaPAGHfb8s_fNLUTIoUf0v0Isgg1UG9sGqwYG6f5vxrcsyIBISSR-gYBoeDcHW4TpaElu7bXY5Ztv/s1600/00001.png" /></a><br />
<br />
Наблюдаем красоту и имеем удобство в редактировании.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyqXsql6y66pdsGbix3mM9MZS4HPku5rfNcHZSANHWgJkAicc0vpvVma5xrYNz8QYoStM07TUXYag3JZoPh8HRPKaNTl16WgKByxLrYkNp_cQsOt83yKAPtbFK9JO90BcQwnrnmvHvWZ9J/s1600/00002.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyqXsql6y66pdsGbix3mM9MZS4HPku5rfNcHZSANHWgJkAicc0vpvVma5xrYNz8QYoStM07TUXYag3JZoPh8HRPKaNTl16WgKByxLrYkNp_cQsOt83yKAPtbFK9JO90BcQwnrnmvHvWZ9J/s1600/00002.png" /></a><br />
<br />
После внесения изменений необходимо выполнить сохранение и закрыть редактор. Содержимое файла перенесется в соответствующий реквизит формы, а файл удалится.<br />
<br />
Конвертация данных, редакция 3.0 (3.0.5.3)<br />
1С:Предприятие 8.3.10+ (разрабатывалось на 8.3.10.2580)<br />
Исходники и расширение выложены на <a href="https://github.com/mickey1cx/vsc_ext_for_ConvData_30" target="_blank">Github</a>.<br />
Публикация на <a href="https://infostart.ru/public/868632" target="_blank">Инфостарт</a>.</div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com0tag:blogger.com,1999:blog-7763816944206062403.post-43300076784768626592018-07-11T14:31:00.000+03:002018-10-24T09:17:17.313+03:00Об изменении экзамена 1С:Эксперт по технологическим вопросам<div dir="ltr" style="text-align: left;" trbidi="on">
Для интересующихся темой "1С: Эксперт" - вчера 1С выпустило <strike>приказ №66</strike> информационное письмо №24738 об изменениях в экзамене. Вкратце, теперь экзамен и тренинг разделены. Сам экзамен длится два дня. Первый день - практика, решение задач, второй день - сдача теории. Дополнительно необходимо подтвердить свой опыт либо через письмо от организации, либо через участие в программе "<a href="http://1c.ru/news/info.jsp?id=23791" target="_blank">Претендент в 1С:Эксперты по технологическим вопросам</a>".<br />
<br />
Подробности на <a href="https://1c.ru/news/info.jsp?id=24738" target="_blank">1c.ru</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/apCuRmE_mvc/0.jpg" frameborder="0" height="400" src="https://www.youtube.com/embed/apCuRmE_mvc?feature=player_embedded" width="480"></iframe></div>
<br /></div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com0tag:blogger.com,1999:blog-7763816944206062403.post-59982454028368251732018-04-18T17:31:00.003+03:002018-04-18T17:31:57.935+03:00Вебинар "Использование расширений для адаптации современных типовых решений"<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<iframe width="512" height="426" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/e7_aCHAls54/0.jpg" src="https://www.youtube.com/embed/e7_aCHAls54?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br /></div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com0tag:blogger.com,1999:blog-7763816944206062403.post-11632534477048178092017-11-30T15:57:00.001+03:002017-11-30T15:57:27.361+03:00Запись вебинара "Анализ технологического журнала 1С с помощью регулярных выражений"<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/pV8wgI8haf4/0.jpg" frameborder="0" height="426" src="https://www.youtube.com/embed/pV8wgI8haf4?feature=player_embedded" width="512"></iframe></div>
<br /></div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com0tag:blogger.com,1999:blog-7763816944206062403.post-42491301325517241172017-10-08T20:00:00.001+03:002017-10-08T20:00:21.964+03:00База с паранормальными явлениями<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUY9EKFHKb27HeLUSLwnNQiOw4QkoDhnBI3wS7hkHtNAaGDOnKUlvWPaBecQNg_VEIYzYnnjQ1kS4zur8mEjQiAaSifaTY4TzMEgSsU-v34DAD-nneFeOEFY2e84Mw5SmKN0bNH29Ke_6N/s1600/para_base.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="100" data-original-width="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUY9EKFHKb27HeLUSLwnNQiOw4QkoDhnBI3wS7hkHtNAaGDOnKUlvWPaBecQNg_VEIYzYnnjQ1kS4zur8mEjQiAaSifaTY4TzMEgSsU-v34DAD-nneFeOEFY2e84Mw5SmKN0bNH29Ke_6N/s1600/para_base.png" /></a></div>
На днях дали базу 1С:ERP на анализ. Симптомы - все тормозит. Открытие конфигуратора (примерно 1,5 часа), клиента, переходы по навигационным ссылкам - все. Остальные базы в кластере работают нормально, в том числе и другая ERP, а с этой непонятная беда. Чистка кэша, тестирование/исправление, DBCC CHECKDB, разворачивание из SQL бэкапа в чистую базу, выгрузка/загрузка .dt, пересоздание базы в кластере, какие-то еще шаманства - ничего не помогает.<br />
<a name='more'></a><br />
Ок, развернул базу, решил посмотреть в SQL Profiler, какие запросы выполняются при запуске базы. Внимание привлекло следующее поведение. После каждого служебного запроса к таблице Config<br />
<br />
<code><span style="color: blue;">exec</span> <span style="color: #af0000;">sp_executesql</span> N<span style="color: red;">'SELECT Creation,Modified,Attributes,DataSize,BinaryData FROM Config WHERE FileName = @P1 ORDER BY PartNo'</span>,N<span style="color: red;">'@P1 nvarchar(128)'</span>,N<span style="color: red;">'086d69d6-e2fa-45cb-84b6-f8f3e2919160'</span></code>
<br />
<br />
дополнительно выполняется<br />
<br />
<code><span style="color: blue;">exec</span> <span style="color: #af0000;">sp_executesql</span> N<span style="color: red;">'SELECT FileName,Creation,Modified,Attributes,DataSize FROM Config WHERE PartNo = 0 and FileName LIKE @P1'</span>,N<span style="color: red;">'@P1 nvarchar(128)'</span>,N<span style="color: red;">'_____________________________________dynupdate_%'</span></code><br />
<br />
Проверка на нормально работающей базе показала отсутствие запросов с таким параметром. То есть можно предположить, что процесс динамического обновления конфигурации некорректно отработал и где-то в базе записана информация, наличие которой приводит к появлению этих дополнительных запросов. Ближе к началу трассировки были обнаружены следующие строки, из контекста которых можно предположить,что они как-то связаны с динамическим обновлением:<br />
<br />
<code><span style="color: blue;">exec</span> <span style="color: #af0000;">sp_executesql</span> N<span style="color: red;">'SELECT Creation,Modified,Attributes,DataSize,BinaryData FROM Params WHERE FileName = @P1 ORDER BY PartNo'</span>,N<span style="color: red;">'@P1 nvarchar(128)'</span>,N<span style="color: red;">'DynamicallyUpdated'</span></code>
<br />
<br />
<code><span style="color: blue;">exec</span> <span style="color: #af0000;">sp_executesql</span> N<span style="color: red;">'SELECT FileName,Creation,Modified,Attributes,DataSize FROM Config WHERE PartNo = 0 and FileName = @P1'</span>,N<span style="color: red;">'@P1 nvarchar(128)'</span>,N<span style="color: red;">'DynamicallyUpdated'</span></code><br />
<br />
Выполнение этих запросов в эталонной базе показало отсутствие подходящих записей, в проблемной базе было выявлено наличие данных.<br />
<br />
<code><span style="color: blue;">Select</span> <span style="color: grey;">*</span> <span style="color: blue;">FROM</span> Config <span style="color: blue;">WHERE</span> FileName like <span style="color: red;">'DynamicallyUpdated'</span>;<br />
<span style="color: blue;">Select</span> <span style="color: grey;">*</span> <span style="color: blue;">FROM</span> Params <span style="color: blue;">WHERE</span> FileName like <span style="color: red;">'DynamicallyUpdated'</span>;</code><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjevDCJ5iJxp1rl5PjAHcPhbACp8AkoCMD530Fu1dDqfD3aKYrrfOrbQ27qDD9r85NRLvlaE_wZk_sMaRchvpc2RUDy9V_oaEx6AgH-_CCqOb4GULdH2SG20F4l1USH0GBMF8ULD89T_D59/s1600/sql_dynupd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="131" data-original-width="922" height="90" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjevDCJ5iJxp1rl5PjAHcPhbACp8AkoCMD530Fu1dDqfD3aKYrrfOrbQ27qDD9r85NRLvlaE_wZk_sMaRchvpc2RUDy9V_oaEx6AgH-_CCqOb4GULdH2SG20F4l1USH0GBMF8ULD89T_D59/s640/sql_dynupd.png" width="640" /></a></div>
<br />
Далее в проблемной базе было выполнен скрипт:<br />
<br />
<code><span style="color: blue;">Delete</span> <span style="color: blue;">FROM</span> Config <span style="color: blue;">WHERE</span> FileName like <span style="color: red;">'DynamicallyUpdated'</span>;<br />
<span style="color: blue;">Delete</span> <span style="color: blue;">FROM</span> Params <span style="color: blue;">WHERE</span> FileName like <span style="color: red;">'DynamicallyUpdated'</span>;</code>
<br />
<br />
После чего тормоза пропали, клиент и конфигуратор стали нормально запускаться. Вот так сеанс экзорцизма превратился в решение технической проблемы.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1hiwOtUkMmEwE1xUTKeOuM0z_beP1Jg9Mw5zIdyydrcOyUb-ebn_sCq_4gs-8DE9vgMWWmlfUNdM7JUHY7JQsQpBMf7V_mCvGm7luwo0vuRhqNwHT9P2QZjaua6Iccp4pBypSUc-BAZYk/s1600/Ghostbusters_logo.svg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1hiwOtUkMmEwE1xUTKeOuM0z_beP1Jg9Mw5zIdyydrcOyUb-ebn_sCq_4gs-8DE9vgMWWmlfUNdM7JUHY7JQsQpBMf7V_mCvGm7luwo0vuRhqNwHT9P2QZjaua6Iccp4pBypSUc-BAZYk/s400/Ghostbusters_logo.svg.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
По результатам поиска по "1c DynamicallyUpdated" было найдено несколько статей, например <a href="https://infostart.ru/public/312157/" target="_blank">"Динамическое обновление. Отказ работы механизма сравнения/объединения файлов конфигурации"</a>, рекомендую к ознакомлению.<br />
<br /></div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com5tag:blogger.com,1999:blog-7763816944206062403.post-29226248855510848992017-09-10T23:50:00.000+03:002017-09-10T23:52:30.337+03:00bash, еще bash, еще много-много bash<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifndkvoFyOcUjEEtf9ROPZicuIw0Zneag44PKXuur4pBdlzlie_7gubefmVglyZxxxnTBkvQL8u_RLNqtIw6Am8RpGnpVe8qLcAZr1o6BFuL5JOcWEAsZSPWlYpSbzrvckeKKf4iqbxOa_/s1600/bash100.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="100" data-original-width="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifndkvoFyOcUjEEtf9ROPZicuIw0Zneag44PKXuur4pBdlzlie_7gubefmVglyZxxxnTBkvQL8u_RLNqtIw6Am8RpGnpVe8qLcAZr1o6BFuL5JOcWEAsZSPWlYpSbzrvckeKKf4iqbxOa_/s1600/bash100.png" /></a>А на ловца и зверь бежит, коллеги. Буквально недавно эпизодически bash'ил подведомственный техжурнал и делал заготовки скриптов. И тут свершилось - двухнедельный проект по анализу текущих проблем производительности. Без ограничений не обошлось, в лучших традициях жанра. Конфигурация УПП 1.3 - соответственно, древняя БСП, где подсистема оценки производительности еще на перечислениях. На продуктив ходить только под присмотром, самостоятельно ничего не менять, ничего не запускать. ЦУП нельзя, как сказали, уже пробовали - сбор данных тормозит систему. Заказчик привел адекватные аргументы в пользу поставленных ограничений. В итоге, из доступных инструментов остались логи технологического журнала и счетчики производительности, которые складываются на отдельный тестовый сервер. Там же развернута копия базы. Если бы не скрипты, то тогда вообще непонятно бы было, что со всем этим делать.<br />
<a name='more'></a><br />
Используемый logcfg.xml:<br />
<br />
<div style="background: #ffffff; border: none; overflow: auto; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: teal;"><?xml version="1.0"?></span>
<span style="color: navy; font-weight: bold;"><config</span> <span style="color: red;">xmlns=</span><span style="color: blue;">"http://v8.1c.ru/v8/tech-log"</span><span style="color: navy; font-weight: bold;">></span>
<span style="color: navy; font-weight: bold;"><dump</span> <span style="color: red;">create=</span><span style="color: blue;">"false"</span><span style="color: navy; font-weight: bold;">/></span>
<span style="color: navy; font-weight: bold;"><log</span> <span style="color: red;">location=</span><span style="color: blue;">"f:\tech_log\events"</span> <span style="color: red;">history=</span><span style="color: blue;">"12"</span><span style="color: navy; font-weight: bold;">></span>
<span style="color: navy; font-weight: bold;"><event></span>
<span style="color: navy; font-weight: bold;"><eq</span> <span style="color: red;">property=</span><span style="color: blue;">"name"</span> <span style="color: red;">value=</span><span style="color: blue;">"call"</span><span style="color: navy; font-weight: bold;">/></span>
<span style="color: navy; font-weight: bold;"></event></span>
<span style="color: navy; font-weight: bold;"><event></span>
<span style="color: navy; font-weight: bold;"><eq</span> <span style="color: red;">property=</span><span style="color: blue;">"name"</span> <span style="color: red;">value=</span><span style="color: blue;">"scall"</span><span style="color: navy; font-weight: bold;">/></span>
<span style="color: navy; font-weight: bold;"></event></span>
<span style="color: navy; font-weight: bold;"><event></span>
<span style="color: navy; font-weight: bold;"><eq</span> <span style="color: red;">property=</span><span style="color: blue;">"name"</span> <span style="color: red;">value=</span><span style="color: blue;">"sdbl"</span><span style="color: navy; font-weight: bold;">/></span>
<span style="color: navy; font-weight: bold;"></event></span>
<span style="color: navy; font-weight: bold;"><event></span>
<span style="color: navy; font-weight: bold;"><eq</span> <span style="color: red;">property=</span><span style="color: blue;">"name"</span> <span style="color: red;">value=</span><span style="color: blue;">"dbmssql"</span><span style="color: navy; font-weight: bold;">/></span>
<span style="color: navy; font-weight: bold;"></event></span>
<span style="color: navy; font-weight: bold;"><property</span> <span style="color: red;">name=</span><span style="color: blue;">"all"</span><span style="color: navy; font-weight: bold;">/></span>
<span style="color: navy; font-weight: bold;"></log></span>
<span style="color: navy; font-weight: bold;"><log</span> <span style="color: red;">location=</span><span style="color: blue;">"f:\tech_log\excp"</span> <span style="color: red;">history=</span><span style="color: blue;">"12"</span><span style="color: navy; font-weight: bold;">></span>
<span style="color: navy; font-weight: bold;"><event></span>
<span style="color: navy; font-weight: bold;"><eq</span> <span style="color: red;">property=</span><span style="color: blue;">"name"</span> <span style="color: red;">value=</span><span style="color: blue;">"excp"</span><span style="color: navy; font-weight: bold;">/></span>
<span style="color: navy; font-weight: bold;"></event></span>
<span style="color: navy; font-weight: bold;"><property</span> <span style="color: red;">name=</span><span style="color: blue;">"all"</span><span style="color: navy; font-weight: bold;">/></span>
<span style="color: navy; font-weight: bold;"></log></span>
<span style="color: navy; font-weight: bold;"><log</span> <span style="color: red;">location=</span><span style="color: blue;">"f:\tech_log\long_events"</span> <span style="color: red;">history=</span><span style="color: blue;">"12"</span><span style="color: navy; font-weight: bold;">></span>
<span style="color: navy; font-weight: bold;"><event></span>
<span style="color: navy; font-weight: bold;"><ne</span> <span style="color: red;">property=</span><span style="color: blue;">"name"</span> <span style="color: red;">value=</span><span style="color: blue;">""</span><span style="color: navy; font-weight: bold;">/></span>
<span style="color: navy; font-weight: bold;"><ge</span> <span style="color: red;">property=</span><span style="color: blue;">"Durationus"</span> <span style="color: red;">value=</span><span style="color: blue;">"3000000"</span><span style="color: navy; font-weight: bold;">/></span>
<span style="color: navy; font-weight: bold;"></event></span>
<span style="color: navy; font-weight: bold;"><property</span> <span style="color: red;">name=</span><span style="color: blue;">"all"</span><span style="color: navy; font-weight: bold;">/></span>
<span style="color: navy; font-weight: bold;"></log></span>
<span style="color: navy; font-weight: bold;"><log</span> <span style="color: red;">location=</span><span style="color: blue;">"f:\tech_log\tlocks"</span> <span style="color: red;">history=</span><span style="color: blue;">"12"</span><span style="color: navy; font-weight: bold;">></span>
<span style="color: navy; font-weight: bold;"><event></span>
<span style="color: navy; font-weight: bold;"><eq</span> <span style="color: red;">property=</span><span style="color: blue;">"Name"</span> <span style="color: red;">value=</span><span style="color: blue;">"TLOCK"</span><span style="color: navy; font-weight: bold;">/></span>
<span style="color: navy; font-weight: bold;"></event></span>
<span style="color: navy; font-weight: bold;"><property</span> <span style="color: red;">name=</span><span style="color: blue;">"all"</span><span style="color: navy; font-weight: bold;">/></span>
<span style="color: navy; font-weight: bold;"></log></span>
<span style="color: navy; font-weight: bold;"><log</span> <span style="color: red;">location=</span><span style="color: blue;">"f:\tech_log\deadlocks"</span> <span style="color: red;">history=</span><span style="color: blue;">"12"</span><span style="color: navy; font-weight: bold;">></span>
<span style="color: navy; font-weight: bold;"><event></span>
<span style="color: navy; font-weight: bold;"><eq</span> <span style="color: red;">property=</span><span style="color: blue;">"Name"</span> <span style="color: red;">value=</span><span style="color: blue;">"TLOCK"</span><span style="color: navy; font-weight: bold;">/></span>
<span style="color: navy; font-weight: bold;"><ne</span> <span style="color: red;">property=</span><span style="color: blue;">"WaitConnections"</span> <span style="color: red;">value=</span><span style="color: blue;">""</span><span style="color: navy; font-weight: bold;">/></span>
<span style="color: navy; font-weight: bold;"></event></span>
<span style="color: navy; font-weight: bold;"><event></span>
<span style="color: navy; font-weight: bold;"><eq</span> <span style="color: red;">property=</span><span style="color: blue;">"Name"</span> <span style="color: red;">value=</span><span style="color: blue;">"TTIMEOUT"</span><span style="color: navy; font-weight: bold;">/></span>
<span style="color: navy; font-weight: bold;"></event></span>
<span style="color: navy; font-weight: bold;"><event></span>
<span style="color: navy; font-weight: bold;"><eq</span> <span style="color: red;">property=</span><span style="color: blue;">"Name"</span> <span style="color: red;">value=</span><span style="color: blue;">"TDEADLOCK"</span><span style="color: navy; font-weight: bold;">/></span>
<span style="color: navy; font-weight: bold;"></event></span>
<span style="color: navy; font-weight: bold;"><property</span> <span style="color: red;">name=</span><span style="color: blue;">"all"</span><span style="color: navy; font-weight: bold;">/></span>
<span style="color: navy; font-weight: bold;"></log></span>
<span style="color: navy; font-weight: bold;"></config></span>
</pre>
</div>
<br />
Общий объем логов для анализа составил порядка 230 гигабайт. Для получения первичных данных использовалось 15 скриптов. Данных разбора оказалось вполне достаточно для определения участков начала анализа. Были выявлены и проанализированы эскалации на блокировках MSSQL, взаимоблокировки на управляемых блокировках и неоптимальные запросы.<br />
<br />
После первого дня стало понятно, что было бы неплохо иметь какой-нибудь скрипт, который будет запускать все остальные скрипты. При этом желательно параллельно, чтобы загрузить выделенные ресурсы по максимуму. После часового сеанса гуглотерапии был написан запускатор.<br />
<br />
Реализованы два варианта запуска:<br />
<br />
$ bash main.sh /e/log_2017_08_30 - анализирует данные в каталоге e/log_2017_08_30, создает в каталоге скрипта подкаталог log_2017_08_30 и складывает в него результаты разбора<br />
<br />
$ bash main.sh /e/log_2017_08_30 /f/result/2017_08_30 - анализирует данные в каталоге /e/log_2017_08_30 и складывает в /f/result/2017_08_30 результаты разбора<br />
<br />
<div style="background: #f8f8f8; border: none; overflow: auto; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-style: italic;">#!/bin/bash</span></pre>
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-style: italic;">#main.sh - one script to rule them all</span></pre>
<pre style="line-height: 125%; margin: 0;"><pre style="line-height: 16.25px;"><span style="color: #008800; font-style: italic;">#scr/* script_dir</span></pre>
</pre>
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-style: italic;">#$1 tech_log_dir</span>
<span style="color: #008800; font-style: italic;">#$2 result_dir</span>
<span style="color: #aa22ff; font-weight: bold;">if</span> <span style="color: #666666;">[</span> <span style="color: #bb4444;">"$1"</span> <span style="color: #666666;">=</span> <span style="color: #bb4444;">""</span> <span style="color: #666666;">]</span>
<span style="color: #aa22ff; font-weight: bold;">then </span>
<span style="color: #aa22ff;">echo</span> <span style="color: #bb4444;">'set param tech_log_dir (1)'</span>
<span style="color: #aa22ff;">exit</span>
<span style="color: #aa22ff; font-weight: bold;">fi</span>
<span style="color: darkgoldenrod;">tech_log_dir</span><span style="color: #666666;">=</span><span style="color: darkgoldenrod;">$1</span>
<span style="color: #aa22ff; font-weight: bold;">if</span> <span style="color: #666666;">[</span> <span style="color: #bb4444;">"$2"</span> <span style="color: #666666;">=</span> <span style="color: #bb4444;">""</span> <span style="color: #666666;">]</span>
<span style="color: #aa22ff; font-weight: bold;">then </span>
<span style="color: darkgoldenrod;">result_dir</span><span style="color: #666666;">=</span><span style="color: #aa22ff; font-weight: bold;">$(</span>basename <span style="color: darkgoldenrod;">$1</span><span style="color: #aa22ff; font-weight: bold;">)</span>
<span style="color: #aa22ff; font-weight: bold;">else</span>
<span style="color: darkgoldenrod;">result_dir</span><span style="color: #666666;">=</span><span style="color: darkgoldenrod;">$2</span>
<span style="color: #aa22ff; font-weight: bold;">fi</span>
<span style="color: #aa22ff; font-weight: bold;">if</span> ! <span style="color: #666666;">[</span> -d <span style="color: darkgoldenrod;">$result_dir</span> <span style="color: #666666;">]</span>
<span style="color: #aa22ff; font-weight: bold;">then</span>
mkdir <span style="color: darkgoldenrod;">$result_dir</span>
<span style="color: #aa22ff; font-weight: bold;">fi</span>
<span style="color: #aa22ff; font-weight: bold;">for </span>i in scr/*.sh; <span style="color: #aa22ff; font-weight: bold;">do</span> <span style="color: darkgoldenrod;">$i</span> <span style="color: darkgoldenrod;">$tech_log_dir</span> <span style="color: darkgoldenrod;">$result_dir</span> & <span style="color: #aa22ff; font-weight: bold;">done</span>
</pre>
</div>
<br />
После запуска откидываемся на спинку кресла, пьем чай/кофе и наслаждаемся 100% загрузкой процессора.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjexkrh1_1TjXHCZCLneGnq9uy95dbXIXsGSx1FPr0JhK9MtRRaBC-JT6ff8UVfhyR_1_PZIJJLKnGR9H831FsEC4nUgOP-fwyJM8SgrLORgfhatVc_sd5GVZw40tlk6dWjGIGqRBWUUWeK/s1600/bash.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="410" data-original-width="734" height="357" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjexkrh1_1TjXHCZCLneGnq9uy95dbXIXsGSx1FPr0JhK9MtRRaBC-JT6ff8UVfhyR_1_PZIJJLKnGR9H831FsEC4nUgOP-fwyJM8SgrLORgfhatVc_sd5GVZw40tlk6dWjGIGqRBWUUWeK/s640/bash.png" width="640" /></a></div>
<br />
Запускатор передает в скрипты разбора два параметра:<br />
$1 - каталог логов техжурнала;<br />
$2 - каталог для сохранения результатов разбора.<br />
<br />
Представленные ниже скрипты были взяты в качестве примера из <a href="https://its.1c.ru/db/metod8dev#content:5927:hdoc" target="_blank">публикации на ИТС</a> и адаптированы под передаваемые параметры и структуру каталогов технологического журнала. Готовые скрипты складываются в подкаталог /scr каталога расположения основного скрипта.<br />
<br />
<div style="background: #f8f8f8; border: none; overflow: auto; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-style: italic;">#!/bin/bash</span>
<span style="color: #008800; font-style: italic;">#scr/long_transactions.sh</span>
cat <span style="color: darkgoldenrod;">$1</span>/events/rphost*/*.log | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -n -e <span style="color: #bb4444;">'if (/^\d\d:\d\d\.\d+/) {$event =~ s/.\n/<line>/g; print $event."\n"; $event = "";} $event .= $_; END{print $event};'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/\xef\xbb\xbf//g'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
grep -P <span style="color: #bb4444;">"SDBL.*Func=(Commit|Rollback)Transaction.*Context"</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/^\d+:\d+.\d+-//g'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/,SDBL,.*Context.*<line>[ \t]+/,Context=/g'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/,SDBL,.*Context=/,Context=/g'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
sed <span style="color: #bb4444;">'s/<line>//g'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
awk -F<span style="color: #bb4444;">',Context='</span> <span style="color: #bb4444;">'{sum[$2]+=$1; count[$2]+=1;} END {for(i in sum) {print sum[i] " " sum[i]/count[i] " " count[i] " " i}}'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
sort -rnb | <span style="color: #bb6622; font-weight: bold;">\</span>
head -n 5 > <span style="color: darkgoldenrod;">$2</span>/long_transactions.txt
</pre>
</div>
<br />
<div style="background: #f8f8f8; border: none; overflow: auto; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-style: italic;">#!/bin/bash</span>
<span style="color: #008800; font-style: italic;">#scr/long_queries.sh</span>
cat <span style="color: darkgoldenrod;">$1</span>/events/rphost*/*.log | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -n -e <span style="color: #bb4444;">'if (/^\d\d:\d\d\.\d+/) {$event =~ s/.\n/<line>/g; print $event."\n"; $event = "";} $event .= $_; END{print $event};'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/\xef\xbb\xbf//g'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
grep -P <span style="color: #bb4444;">"DBMSSQL.*Sql"</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
grep -v <span style="color: #bb4444;">'Context'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/<line>//'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/^\d+:\d+.\d+-//g'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/,DBMSSQL,.*Sql=/,Sql=/g'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/\w+-\w+-\w+-\w+-\w+/{GUID}/g'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/\(\d+\)/({NUM})/g'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/tt\d+/{TempTable}/g'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
awk -F<span style="color: #bb4444;">',Sql='</span> <span style="color: #bb4444;">'{sum[$2]+=$1; count[$2]+=1;} END {for(i in sum) {print sum[i] " " sum[i]/count[i] " " count[i] " " i}}'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
sort -rnb | <span style="color: #bb6622; font-weight: bold;">\</span>
head > <span style="color: darkgoldenrod;">$2</span>/long_queries.txt
</pre>
</div>
<br />
<div style="background: #f8f8f8; border: none; overflow: auto; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-style: italic;">#!/bin/bash</span>
<span style="color: #008800; font-style: italic;">#scr/long_calls.sh</span>
cat <span style="color: darkgoldenrod;">$1</span>/events/rphost*/*.log | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -n -e <span style="color: #bb4444;">'if (/^\d\d:\d\d\.\d+/) {$event =~ s/.\n/<line>/g; print $event."\n"; $event = "";} $event .= $_; END{print $event};'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/\xef\xbb\xbf//g'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
grep -P <span style="color: #bb4444;">",CALL,.*,Context="</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/<line>//'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/^\d+:\d+.\d+-//g'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/,CALL,.*Context/,Context/g'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/,Interface=.*OutBytes=\d+//g'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
awk -F<span style="color: #bb4444;">',Context='</span> <span style="color: #bb4444;">'{sum[$2]+=$1; count[$2]+=1;} END {for(i in sum) {printf "%d %d %d %s\n",sum[i],sum[i]/count[i], count[i],i}}'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
sort -rnb | <span style="color: #bb6622; font-weight: bold;">\</span>
head -n 5 > <span style="color: darkgoldenrod;">$2</span>/long_calls.txt</pre>
</div>
<br />
<div style="background: #f8f8f8; border: none; overflow: auto; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-style: italic;">#!/bin/bash</span>
<span style="color: #008800; font-style: italic;">#scr/long_waits.sh</span>
cat <span style="color: darkgoldenrod;">$1</span>/deadlocks/rphost*/*.log | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -n -e <span style="color: #bb4444;">'if (/^\d\d:\d\d\.\d+/) {$event =~ s/.\n/<line>/g; print $event."\n"; $event = "";} $event .= $_; END{print $event};'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/\xef\xbb\xbf//g'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
grep -P <span style="color: #bb4444;">",TLOCK,.*WaitConnections=\d+,Context"</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/^\d+:\d+.\d+-//g'</span> | grep -P <span style="color: #bb4444;">'WaitConnections=\d+'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/,Locks=.*$//g'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
perl -pe <span style="color: #bb4444;">'s/,TLOCK,.*Regions=/,Regions=/g'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
sed <span style="color: #bb4444;">'s/<line>//g'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
awk -F<span style="color: #bb4444;">',Regions='</span> <span style="color: #bb4444;">'{sum[$2]+=$1; count[$2]+=1;} END {for(i in sum) {printf "%d %d %d %s\n", sum[i], sum[i]/count[i],count[i],i}}'</span> | <span style="color: #bb6622; font-weight: bold;">\</span>
sort -rnb | <span style="color: #bb6622; font-weight: bold;">\</span>
head -n 5 > <span style="color: darkgoldenrod;">$2</span>/long_waits.txt
</pre>
</div>
<br />
Первые три скрипта можно скопировать и настроить на каталог long_events.<br />
<br />
В итоге, использование скриптов показало достаточную эффективность для разбора данных технологического журнала 1С и поиска узких мест. Результаты при необходимости можно использовать для определения мест встраивания подсистемы оценки производительности. Или же, как в моем случае, можно разработать простую конфигурацию для загрузки полученных данных и последующего анализа.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvlLlxJabv2JWiYTO0Va1pLXbmzi9i1bMZ2QGns-YlmTQD2mcjknR6TQeiW91Febq7i1u3hchWmLSA2V3NkyvJC4K0eoyjvjAWlfT1e_hTIbosKkJQvAip2nwZWmN6OI8PK5T_b3Gbu4sj/s1600/aggr.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="342" data-original-width="216" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvlLlxJabv2JWiYTO0Va1pLXbmzi9i1bMZ2QGns-YlmTQD2mcjknR6TQeiW91Febq7i1u3hchWmLSA2V3NkyvJC4K0eoyjvjAWlfT1e_hTIbosKkJQvAip2nwZWmN6OI8PK5T_b3Gbu4sj/s1600/aggr.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
Использование базы для агрегации результатов мне тоже понравилось. В планах добавить аналог подсистемы оценки производительности и регламентное задание, выполняющее:<br />
- автоматическое архивирование технологического журнала предыдущего часа;<br />
- запуск разбора данных предыдущего часа;<br />
- загрузку полученных данных в базу.<br />
<br /></div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com0tag:blogger.com,1999:blog-7763816944206062403.post-21678975330868310232017-08-13T21:21:00.000+03:002017-09-10T23:53:04.265+03:00grep всему голова<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8LafJRDrKuFJ2DC1a-NOKIGJFYmnt3vS3AzsXtDKQ1ak-FNfMNWsccT_fSlRlAjhrw33D39d78OiuaGYqJlmAvHVRDF2w-Cc6WKjJvOOM19qVYAJoFO0Nc6oDpppylpIq_LO0dRCZTUkZ/s1600/Bash-new.sh.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="100" data-original-width="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8LafJRDrKuFJ2DC1a-NOKIGJFYmnt3vS3AzsXtDKQ1ak-FNfMNWsccT_fSlRlAjhrw33D39d78OiuaGYqJlmAvHVRDF2w-Cc6WKjJvOOM19qVYAJoFO0Nc6oDpppylpIq_LO0dRCZTUkZ/s1600/Bash-new.sh.png" /></a>При разборе проблем, связанных с эксплуатацией 1С, анализ технологического журнала играет немаловажную роль. При этом объемы данных для анализа могут достигать приличных размеров. Что, в свою очередь, приводит к необходимости использования инструментов, обеспечивающих приемлемую скорость разбора файлов журнала. Например, использование утилит bash. В качестве вводной статьи могу порекомендовать ознакомиться с <a href="https://its.1c.ru/db/metod8dev#content:5927:hdoc" target="_blank">публикацией на ИТС</a>. Практическое применение рассмотрим на примере анализа взаимоблокировок.<br />
<br />
<a name='more'></a>Начнем с настроек технологического журнала. Для фиксации событий, связанных с управляемыми блокировками необходимо добавить в файл настроек следующую секцию:<br />
<br />
<pre style="background: #ffffff; color: black;"><span style="color: #7f0055;"><</span><span style="color: #7f0055;">log</span> location=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">e:\tech_log\tlocks</span><span style="color: #2a00ff;">"</span> history=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">24</span><span style="color: #2a00ff;">"</span><span style="color: #7f0055;">></span>
<span style="color: #7f0055;"><</span><span style="color: #7f0055;">event</span><span style="color: #7f0055;">></span>
<span style="color: #7f0055;"><</span><span style="color: #7f0055;">eq</span> property=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">Name</span><span style="color: #2a00ff;">"</span> value=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">TLOCK</span><span style="color: #2a00ff;">"</span><span style="color: #7f0055;">/></span>
<span style="color: #7f0055;"></</span><span style="color: #7f0055;">event</span><span style="color: #7f0055;">></span>
<span style="color: #7f0055;"><</span><span style="color: #7f0055;">event</span><span style="color: #7f0055;">></span>
<span style="color: #7f0055;"><</span><span style="color: #7f0055;">eq</span> property=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">Name</span><span style="color: #2a00ff;">"</span> value=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">TTIMEOUT</span><span style="color: #2a00ff;">"</span><span style="color: #7f0055;">/></span>
<span style="color: #7f0055;"></</span><span style="color: #7f0055;">event</span><span style="color: #7f0055;">></span>
<span style="color: #7f0055;"><</span><span style="color: #7f0055;">event</span><span style="color: #7f0055;">></span>
<span style="color: #7f0055;"><</span><span style="color: #7f0055;">eq</span> property=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">Name</span><span style="color: #2a00ff;">"</span> value=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">TDEADLOCK</span><span style="color: #2a00ff;">"</span><span style="color: #7f0055;">/></span>
<span style="color: #7f0055;"></</span><span style="color: #7f0055;">event</span><span style="color: #7f0055;">></span>
<span style="color: #7f0055;"><</span><span style="color: #7f0055;">property</span> name=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">all</span><span style="color: #2a00ff;">"</span><span style="color: #7f0055;">/></span>
<span style="color: #7f0055;"></</span><span style="color: #7f0055;">log</span><span style="color: #7f0055;">></span>
</pre>
<br />
Можно разделить логи на блокировки и ожидания на блокировках, таймауты и дедлоки:<br />
<br />
<pre style="background: #ffffff; color: black;"><span style="color: #7f0055;"><</span><span style="color: #7f0055;">log</span> location=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">e:\tech_log\tlocks</span><span style="color: #2a00ff;">"</span> history=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">24</span><span style="color: #2a00ff;">"</span><span style="color: #7f0055;">></span>
<span style="color: #7f0055;"><</span><span style="color: #7f0055;">event</span><span style="color: #7f0055;">></span>
<span style="color: #7f0055;"><</span><span style="color: #7f0055;">eq</span> property=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">Name</span><span style="color: #2a00ff;">"</span> value=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">TLOCK</span><span style="color: #2a00ff;">"</span><span style="color: #7f0055;">/></span>
<span style="color: #7f0055;"></</span><span style="color: #7f0055;">event</span><span style="color: #7f0055;">></span>
<span style="color: #7f0055;"><</span><span style="color: #7f0055;">property</span> name=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">all</span><span style="color: #2a00ff;">"</span><span style="color: #7f0055;">/></span>
<span style="color: #7f0055;"></</span><span style="color: #7f0055;">log</span><span style="color: #7f0055;">></span>
<span style="color: #7f0055;"><</span><span style="color: #7f0055;">log</span> location=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">e:\tech_log\deadlocks</span><span style="color: #2a00ff;">"</span> history=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">24</span><span style="color: #2a00ff;">"</span><span style="color: #7f0055;">></span>
<span style="color: #7f0055;"><</span><span style="color: #7f0055;">event</span><span style="color: #7f0055;">></span>
<span style="color: #7f0055;"><</span><span style="color: #7f0055;">eq</span> property=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">Name</span><span style="color: #2a00ff;">"</span> value=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">TLOCK</span><span style="color: #2a00ff;">"</span><span style="color: #7f0055;">/></span>
<span style="color: #7f0055;"><</span><span style="color: #7f0055;">ne</span> property=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">WaitConnections</span><span style="color: #2a00ff;">"</span> value=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">"</span><span style="color: #7f0055;">/></span>
<span style="color: #7f0055;"></</span><span style="color: #7f0055;">event</span><span style="color: #7f0055;">></span>
<span style="color: #7f0055;"><</span><span style="color: #7f0055;">event</span><span style="color: #7f0055;">></span>
<span style="color: #7f0055;"><</span><span style="color: #7f0055;">eq</span> property=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">Name</span><span style="color: #2a00ff;">"</span> value=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">TTIMEOUT</span><span style="color: #2a00ff;">"</span><span style="color: #7f0055;">/></span>
<span style="color: #7f0055;"></</span><span style="color: #7f0055;">event</span><span style="color: #7f0055;">></span>
<span style="color: #7f0055;"><</span><span style="color: #7f0055;">event</span><span style="color: #7f0055;">></span>
<span style="color: #7f0055;"><</span><span style="color: #7f0055;">eq</span> property=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">Name</span><span style="color: #2a00ff;">"</span> value=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">TDEADLOCK</span><span style="color: #2a00ff;">"</span><span style="color: #7f0055;">/></span>
<span style="color: #7f0055;"></</span><span style="color: #7f0055;">event</span><span style="color: #7f0055;">></span>
<span style="color: #7f0055;"><</span><span style="color: #7f0055;">property</span> name=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff;">all</span><span style="color: #2a00ff;">"</span><span style="color: #7f0055;">/></span>
<span style="color: #7f0055;"></</span><span style="color: #7f0055;">log</span><span style="color: #7f0055;">></span>
</pre>
<br />
Допустим, действует первая настройка. Тогда я заходу в e:\tech_log\locks и вызываю консоль bash. Для начала мне нужно определить наличие проблем с блокировками.<br />
<br />
<div class="bash" style="font-family: monospace;">
<span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-roP</span> <span style="color: red;">'TDEADLOCK|TTIMEOUT|WaitConnections=\d+'</span></div>
<br />
rphost_7188/17071415.log:WaitConnections=521711<br />
rphost_7188/17071415.log:TDEADLOCK<br />
rphost_7188/17071415.log:WaitConnections=521671<br />
rphost_7188/17071415.log:WaitConnections=521711<br />
rphost_8884/17071410.log:WaitConnections=519948<br />
<div>
<br />
Или так:</div>
<br />
<div class="bash" style="font-family: monospace;">
<span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-rlP</span> <span style="color: red;">'TDEADLOCK|TTIMEOUT|WaitConnections=\d+'</span></div>
<br />
rphost_7188/17071415.log<br />
rphost_8884/17071410.log<br />
<div>
<br /></div>
Переходим к анализу событий TDEADLOCK, проанализируем файл журнала rphost_7188/17071415.log (62 Мб). После нескольких попыток получился следующий скрипт:<br />
<br />
<div class="bash" style="font-family: monospace;">
<span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: black;">rphost_7188</span><span style="color: black; font-weight: bold;">/</span><span style="color: black;">17071415</span>.log <span style="color: black; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #660033;">-vORS</span>= <span style="color: red;">'{if(match($0, "^[0-9][0-9]\:[0-9][0-9]\.[0-9]+\-")) print "\n"$0; else print $0;}'</span> <span style="color: black; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-rn</span> <span style="color: red;">"s/(^.*?),TDEADLOCK,.*connectID=(.*?),SessionID.*,DeadlockConnectionIntersections='(.*),(.*)',Context='(.*)'.*/\1,\2<span style="color: #000099; font-weight: bold;">\n</span>>\3<span style="color: #000099; font-weight: bold;">\n</span>>\4<span style="color: #000099; font-weight: bold;">\n</span>\5/p"</span></div>
<br />
<div class="python" style="font-family: monospace;">
<span style="color: orangered;">31</span>:<span style="color: orangered;">37.377048</span>-<span style="color: orangered;">0</span>,<span style="color: orangered;">521711</span><br />
<span style="color: #66cc66;">></span><span style="color: orangered;">521711</span> <span style="color: orangered;">521671</span> AccumRg48237.<span style="color: black;">DIMS</span> Exclusive Fld1765=<span style="color: orangered;">0</span> Fld48238=<span style="color: orangered;">271</span>:80c3003048ff921111e600a432b00d3f Fld48239=<span style="color: orangered;">658</span>:80e2003048ff921111e76878525e8b59 Fld48240=T<span style="color: darkslateblue;">"20170701000000"</span> Fld48241=<span style="color: orangered;">253</span>:80c4003048ff921111e604954845e95c Fld48241=<span style="color: orangered;">253</span>:80c4003048ff921111e60495663bf22e Fld48241=<span style="color: orangered;">253</span>:80c4003048ff921111e60495663bf231 Fld48242=<span style="color: orangered;">555</span>:00000000000000000000000000000000 Fld48243=<span style="color: orangered;">253</span>:80c4003048ff921111e6049e7e8fd1ef Fld48244=<span style="color: orangered;">555</span>:00000000000000000000000000000000 Period=<span style="color: black;">[</span>T<span style="color: darkslateblue;">"20170701000000"</span>:+<span style="color: black;">]</span> Splitter=<span style="color: orangered;">1</span><br />
<span style="color: #66cc66;">></span><span style="color: orangered;">521671</span> <span style="color: orangered;">521711</span> AccumRg47676.<span style="color: black;">DIMS</span> Exclusive Fld1765=<span style="color: orangered;">0</span> Fld47677=<span style="color: orangered;">253</span>:80c4003048ff921111e6049596245b29 Fld47678=<span style="color: orangered;">555</span>:00000000000000000000000000000000 Fld47679=<span style="color: orangered;">437</span>:80c4003048ff921111e6054e24380748 Period=<span style="color: black;">[</span>T<span style="color: darkslateblue;">"20170701000000"</span>:+<span style="color: black;">]</span><br />
Форма.Записать : Документ.ЗаказКлиента.Форма.ФормаДокументаОбщийМодуль.мо_ПодпискиНаСобытия.Модуль : <span style="color: orangered;">49</span> : Выполнить<span style="color: black;">(</span>Обработчик + <span style="color: darkslateblue;">"(Источник, Отказ, РежимПроведения)"</span><span style="color: black;">)</span><span style="color: #66cc66;">;</span> : <span style="color: orangered;">1</span> : мо_ЗаказКлиентаСервер.ОбработкаПроведения<span style="color: black;">(</span>Источник, Отказ, РежимПроведения<span style="color: black;">)</span> ОбщийМодуль.мо_ЗаказКлиентаСервер.Модуль : <span style="color: orangered;">1041</span> : ОбработкаИзмененияСтатуса<span style="color: black;">(</span>Источник<span style="color: black;">)</span><span style="color: #66cc66;">;</span> ОбщийМодуль.мо_ЗаказКлиентаСервер.Модуль : <span style="color: orangered;">1097</span> : РаспределениеПлана.Загрузить<span style="color: black;">(</span>РегистрыНакопления.мо_РаспределениеПланаНаЗаказыКлиентов.ПолучитьТаблицуДвижений<span style="color: black;">(</span>Источник.Ссылка<span style="color: black;">)</span><span style="color: black;">)</span><span style="color: #66cc66;">;</span> РегистрНакопления.мо_РаспределениеПланаНаЗаказыКлиентов.МодульМенеджера : <span style="color: orangered;">8</span> : Возврат ПолучитьТаблицуДвиженийДляЗаказаКлиента<span style="color: black;">(</span>Ссылка<span style="color: black;">)</span><span style="color: #66cc66;">;</span> РегистрНакопления.мо_РаспределениеПланаНаЗаказыКлиентов.МодульМенеджера : <span style="color: orangered;">33</span> : БлокировкаДанных.Заблокировать<span style="color: black;">(</span><span style="color: black;">)</span><span style="color: #66cc66;">;</span></div>
<br />
<div>
Чтобы составить полную картину возникновения взаимоблокировки необходимо найти еще контексты всех блокировок. Для этого можно попробовать поискать в логах уникальные сочетания полей событий. Так же можно еще указать отбор по времени события, например так:<br />
<br />
<div class="bash" style="font-family: monospace;">
<span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-P</span> <span style="color: red;">"^31:3.*t:connectID=(521711|521671).*AccumRg47676.DIMS Exclusive.*Fld47677=253:80c4003048ff921111e6049596245b29"</span> <span style="color: black; font-weight: bold;">*</span><span style="color: black;">15</span>.log</div>
<br />
<div class="bash" style="font-family: monospace;">
<span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-P</span> <span style="color: red;">"^31:3.*t:connectID=(521711|521671).*AccumRg48237.DIMS Exclusive.*Fld48243=253:80c4003048ff921111e6049e7e8fd1ef"</span> <span style="color: black; font-weight: bold;">*</span><span style="color: black;">15</span>.log</div>
<br />
Но такие команды будут обрезать контексты по первой строке, поэтому для получения всего текста я использовал следующий скрипт:<br />
<br />
<div class="bash" style="font-family: monospace;">
<span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: black; font-weight: bold;">*</span><span style="color: black;">15</span>.log <span style="color: black; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #660033;">-vORS</span>= <span style="color: red;">'{if(match($0, "^[0-9][0-9]\:[0-9][0-9]\.[0-9]+\-")) print "\n"$0; else print $0;}'</span> <span style="color: black; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-P</span> <span style="color: red;">"^31:3.*t:connectID=(521711|521671).*(AccumRg47676.DIMS Exclusive.*Fld47677=253:80c4003048ff921111e6049596245b29 | AccumRg48237.DIMS Exclusive.*Fld48243=253:80c4003048ff921111e6049e7e8fd1ef)"</span> <span style="color: black; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-r</span> <span style="color: red;">"s/(^.*?),TLOCK,.*connectID=(.*?),SessionID=(.*?),Usr.*Locks='(.*Exclusive|.*Shared).*',WaitConnections=(.*),Context='(.*).*'/\1,\2,\3,\4,\5<span style="color: #000099; font-weight: bold;">\n</span>\6/"</span> <span style="color: black; font-weight: bold;">></span> result.txt</div>
<br />
<div>
<div class="python" style="font-family: monospace;">
<span style="color: orangered;">31</span>:<span style="color: orangered;">34.142057</span>-<span style="color: orangered;">108993</span>,<span style="color: orangered;">521711</span>,<span style="color: orangered;">243</span>,AccumRg48237.<span style="color: black;">DIMS</span> Exclusive,<br />
Форма.Записать : Документ.ЗаказКлиента.Форма.ФормаДокументаДокумент.ЗаказКлиента.МодульОбъекта : <span style="color: orangered;">916</span> : ПроведениеСервер.ЗаписатьНаборыЗаписей<span style="color: black;">(</span>ЭтотОбъект<span style="color: black;">)</span><span style="color: #66cc66;">;</span> ОбщийМодуль.ПроведениеСервер.Модуль : <span style="color: orangered;">320</span> : Объект.Движения.Записать<span style="color: black;">(</span><span style="color: black;">)</span><span style="color: #66cc66;">;</span><br />
<span style="color: orangered;">31</span>:<span style="color: orangered;">34.549009</span>-<span style="color: orangered;">15947</span>,<span style="color: orangered;">521711</span>,<span style="color: orangered;">243</span>,AccumRg47676.<span style="color: black;">DIMS</span> Exclusive,<br />
Форма.Записать : Документ.ЗаказКлиента.Форма.ФормаДокументаДокумент.ЗаказКлиента.МодульОбъекта : <span style="color: orangered;">916</span> : ПроведениеСервер.ЗаписатьНаборыЗаписей<span style="color: black;">(</span>ЭтотОбъект<span style="color: black;">)</span><span style="color: #66cc66;">;</span> ОбщийМодуль.ПроведениеСервер.Модуль : <span style="color: orangered;">320</span> : Объект.Движения.Записать<span style="color: black;">(</span><span style="color: black;">)</span><span style="color: #66cc66;">;</span><br />
<span style="color: orangered;">31</span>:<span style="color: orangered;">35.064045</span>-<span style="color: orangered;">77979</span>,<span style="color: orangered;">521671</span>,<span style="color: orangered;">269</span>,AccumRg48237.<span style="color: black;">DIMS</span> Exclusive,<br />
Форма.Записать : Документ.ЗаказКлиента.Форма.ФормаДокументаДокумент.ЗаказКлиента.МодульОбъекта : <span style="color: orangered;">916</span> : ПроведениеСервер.ЗаписатьНаборыЗаписей<span style="color: black;">(</span>ЭтотОбъект<span style="color: black;">)</span><span style="color: #66cc66;">;</span> ОбщийМодуль.ПроведениеСервер.Модуль : <span style="color: orangered;">320</span> : Объект.Движения.Записать<span style="color: black;">(</span><span style="color: black;">)</span><span style="color: #66cc66;">;</span><br />
<span style="color: orangered;">31</span>:<span style="color: orangered;">37.377052</span>-<span style="color: orangered;">15985</span>,<span style="color: orangered;">521711</span>,<span style="color: orangered;">243</span>,AccumRg48237.<span style="color: black;">DIMS</span> Exclusive,<span style="color: orangered;">521671</span><br />
Форма.Записать : Документ.ЗаказКлиента.Форма.ФормаДокументаОбщийМодуль.мо_ПодпискиНаСобытия.Модуль : <span style="color: orangered;">49</span> : Выполнить<span style="color: black;">(</span>Обработчик + <span style="color: darkslateblue;">"(Источник, Отказ, РежимПроведения)"</span><span style="color: black;">)</span><span style="color: #66cc66;">;</span> : <span style="color: orangered;">1</span> : мо_ЗаказКлиентаСервер.ОбработкаПроведения<span style="color: black;">(</span>Источник, Отказ, РежимПроведения<span style="color: black;">)</span> ОбщийМодуль.мо_ЗаказКлиентаСервер.Модуль : <span style="color: orangered;">1041</span> : ОбработкаИзмененияСтатуса<span style="color: black;">(</span>Источник<span style="color: black;">)</span><span style="color: #66cc66;">;</span> ОбщийМодуль.мо_ЗаказКлиентаСервер.Модуль : <span style="color: orangered;">1097</span> : РаспределениеПлана.Загрузить<span style="color: black;">(</span>РегистрыНакопления.мо_РаспределениеПланаНаЗаказыКлиентов.ПолучитьТаблицуДвижений<span style="color: black;">(</span>Источник.Ссылка<span style="color: black;">)</span><span style="color: black;">)</span><span style="color: #66cc66;">;</span> РегистрНакопления.мо_РаспределениеПланаНаЗаказыКлиентов.МодульМенеджера : <span style="color: orangered;">8</span> : Возврат ПолучитьТаблицуДвиженийДляЗаказаКлиента<span style="color: black;">(</span>Ссылка<span style="color: black;">)</span><span style="color: #66cc66;">;</span> РегистрНакопления.мо_РаспределениеПланаНаЗаказыКлиентов.МодульМенеджера : <span style="color: orangered;">33</span> : БлокировкаДанных.Заблокировать<span style="color: black;">(</span><span style="color: black;">)</span><span style="color: #66cc66;">;</span><br />
<span style="color: orangered;">31</span>:<span style="color: orangered;">37.674030</span>-<span style="color: orangered;">2172022</span>,<span style="color: orangered;">521671</span>,<span style="color: orangered;">269</span>,AccumRg47676.<span style="color: black;">DIMS</span> Exclusive,<span style="color: orangered;">521711</span><br />
Форма.Записать : Документ.ЗаказКлиента.Форма.ФормаДокументаДокумент.ЗаказКлиента.МодульОбъекта : <span style="color: orangered;">916</span> : ПроведениеСервер.ЗаписатьНаборыЗаписей<span style="color: black;">(</span>ЭтотОбъект<span style="color: black;">)</span><span style="color: #66cc66;">;</span> ОбщийМодуль.ПроведениеСервер.Модуль : <span style="color: orangered;">320</span> : Объект.Движения.Записать<span style="color: black;">(</span><span style="color: black;">)</span><span style="color: #66cc66;">;</span></div>
<br /></div>
Как видно из результата, сеансы блокируют ресурсы в разном порядке. Рассмотрим сначала участок кода с контекстом "БлокировкаДанных.Заблокировать()". Сначала идет установка блокировки:</div>
<div>
<br />
<pre style="color: blue;">БлокировкаДанных <span style="color: red;">=</span> <span style="color: red;">Новый</span> БлокировкаДанных<span style="color: red;">;</span>
ЭлеменБлокировкиДанных <span style="color: red;">=</span> БлокировкаДанных<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"РегистрНакопления.мо_РаспределениеПланаНаЗаказыКлиентов"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ЭлеменБлокировкиДанных<span style="color: red;">.</span>ИсточникДанных <span style="color: red;">=</span> ЗаказКлиента<span style="color: red;">.</span>мо_Комплектующие<span style="color: red;">;</span>
ЭлеменБлокировкиДанных<span style="color: red;">.</span>ИспользоватьИзИсточникаДанных<span style="color: red;">(</span><span style="color: black;">"Комплектующая"</span><span style="color: red;">,</span><span style="color: black;">"Номенклатура"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ЭлеменБлокировкиДанных<span style="color: red;">.</span>ИспользоватьИзИсточникаДанных<span style="color: red;">(</span><span style="color: black;">"КомплектующаяХарактеристика"</span><span style="color: red;">,</span><span style="color: black;">"Характеристика"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ЭлеменБлокировкиДанных<span style="color: red;">.</span>Режим <span style="color: red;">=</span> РежимБлокировкиДанных<span style="color: red;">.</span>Исключительный<span style="color: red;">;</span>
</pre>
<br /></div>
<div>
Следом идет запрос по остаткам регистра с параметрами виртуальной таблицы остатков:<br />
<br /></div>
<pre style="color: blue;">ЗаказКлиента <span style="color: red;">=</span> ЗНАЧЕНИЕ<span style="color: red;">(</span>Документ<span style="color: red;">.</span>ЗаказКлиента<span style="color: red;">.</span>ПустаяСсылка<span style="color: red;">)</span>
<span style="color: red;">И</span> Организация <span style="color: red;">=</span> <span style="color: brown;">&Организация</span>
<span style="color: red;">И</span> МесяцПланирования <span style="color: red;">=</span> <span style="color: brown;">&МесяцПланирования</span>
</pre>
<br />
<div>
То есть блокировка в текущем случае захватывает лишние данные. Соответственно, проблема решается путем добавления недостающих полей со значениями, используемыми в параметрах запроса:</div>
<div>
<br /></div>
<pre style="color: blue;">ЭлеменБлокировкиДанных<span style="color: red;">.</span>УстановитьЗначение<span style="color: red;">(</span><span style="color: black;">"ЗаказКлиента"</span><span style="color: red;">,</span> Документы<span style="color: red;">.</span>ЗаказКлиента<span style="color: red;">.</span>ПустаяСсылка<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">)</span><span style="color: red;">;</span>
ЭлеменБлокировкиДанных<span style="color: red;">.</span>УстановитьЗначение<span style="color: red;">(</span><span style="color: black;">"Организация"</span><span style="color: red;">,</span> ЗаказКлиента<span style="color: red;">.</span>Организация<span style="color: red;">)</span><span style="color: red;">;</span>
ЭлеменБлокировкиДанных<span style="color: red;">.</span>УстановитьЗначение<span style="color: red;">(</span><span style="color: black;">"МесяцПланирования"</span><span style="color: red;">,</span> НачалоМесяца<span style="color: red;">(</span>ДатаОкончанияПериода<span style="color: red;">)</span><span style="color: red;">)</span><span style="color: red;">;</span>
</pre>
<br />
<div>
Теперь проверим изменения. По журналу регистрации были найдены проблемные документы:</div>
<div>
<br />
<table cellspacing="0" style="border-collapse: collapse; font-family: Arial; font-size: 8pt; overflow: visible; padding: 0px 0px 0px 2px; table-layout: fixed; vertical-align: bottom;">
<tbody style="background: rgb(255, 255, 255); font-size: 8pt; margin: 0px;">
<tr style="display: none;">
<td width="108"></td>
<td width="70"></td>
<td width="172"></td>
<td width="220"></td>
<td width="281"></td>
</tr>
<tr style="height: 17px;">
<td style="background-color: #f2f2f2; border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #4d4d4d; font-size: 10pt; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Дата, время</span></td>
<td style="background-color: #f2f2f2; border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #4d4d4d; font-size: 10pt; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Сеанс</span></td>
<td style="background-color: #f2f2f2; border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #4d4d4d; font-size: 10pt; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Событие</span></td>
<td style="background-color: #f2f2f2; border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #4d4d4d; font-size: 10pt; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Данные</span></td>
<td style="background-color: #f2f2f2; border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #4d4d4d; font-size: 10pt; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Комментарий</span></td>
<td></td>
</tr>
<tr style="height: 15px;">
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; padding-left: 2px; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">14.07.2017 15:31:13</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; text-align: right; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">243</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Данные. Изменение</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Заказ 0000-104142 от 11.07.2017 8:55:26</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"></td>
<td></td>
</tr>
<tr style="height: 15px;">
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; padding-left: 2px; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">14.07.2017 15:31:13</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; text-align: right; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">243</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Данные. Проведение</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Заказ 0000-104142 от 11.07.2017 8:55:26</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"></td>
<td></td>
</tr>
<tr style="height: 15px;">
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; padding-left: 2px; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">14.07.2017 15:31:22</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; text-align: right; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">269</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Данные. Изменение</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Заказ 0000-104253 от 14.07.2017 12:39:29</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"></td>
<td></td>
</tr>
<tr style="height: 15px;">
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; padding-left: 2px; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">14.07.2017 15:31:22</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; text-align: right; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">269</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Данные. Проведение</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Заказ 0000-104253 от 14.07.2017 12:39:29</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"></td>
<td></td>
</tr>
<tr style="height: 113px;">
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; padding-left: 2px; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">14.07.2017 15:31:37</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; text-align: right; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">243</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;">ОшибкаОбработчика.Документ.ОбработкаПроведения</td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Заказ 0000-104143 от 11.07.2017 8:58:18</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;">Ошибка выполнения обработчика мо_ЗаказКлиентаСервер.ОбработкаПроведения (ОбработкаПроведения). Ошибка: {РегистрНакопления.мо_РаспределениеПланаНаЗаказыКлиентов.МодульМенеджера(33)}: Ошибка при вызове метода контекста (Заблокировать): Конфликт блокировок при выполнении транзакции:<br />
Неустранимый конфликт блокировок</td>
<td></td>
</tr>
<tr style="height: 15px;">
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; padding-left: 2px; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">14.07.2017 15:31:45</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; text-align: right; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">269</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Данные. Изменение</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Заказ 0000-104253 от 14.07.2017 12:39:29</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"></td>
<td></td>
</tr>
<tr style="height: 15px;">
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; padding-left: 2px; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">14.07.2017 15:31:45</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; text-align: right; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">269</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Данные. Проведение</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Заказ 0000-104253 от 14.07.2017 12:39:29</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"></td>
<td></td>
</tr>
<tr style="height: 15px;">
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; padding-left: 2px; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">14.07.2017 15:31:53</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; text-align: right; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">243</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Данные. Изменение</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Заказ 0000-104143 от 11.07.2017 8:58:18</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"></td>
<td></td>
</tr>
<tr style="height: 15px;">
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; padding-left: 2px; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">14.07.2017 15:31:53</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; text-align: right; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">243</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Данные. Проведение</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Заказ 0000-104143 от 11.07.2017 8:58:18</span></td>
<td style="border-color: rgb(179, 172, 134); border-style: solid; border-width: 1px; color: #333333; vertical-align: top;"></td>
<td></td>
</tr>
</tbody>
</table>
<br />
В отладочном сеансе на строку установки блокировки была сделана точка останова и один из документов был запущен на проведение. Во втором сеансе было выполнено проведение другого документ, который встал в ожидание. После этого в отладке было продолжено выполнение. И снова получаем взаимоблокировку. Дополнительная проблема оказалась в том, что движения по регистру AccumRg48237 формировались уже в подписке на событие ОбработкаПроведения, а в обработке проведения документа выполнялась команда Движения.Записать(). Что приводило к тому, что по проблемному регистру сначала записывался пустой набор записей. При этом, чтобы корректно удалить существующие движения в базе, устанавливаются управляемые блокировки по этим записям. Решение в этом случае следующее: отключить признак записи по регистру в процедуре обработки проведения модуля документа:<br />
<br />
<pre style="color: blue;">Движения<span style="color: red;">.</span>мо_РаспределениеПланаНаЗаказыКлиентов<span style="color: red;">.</span>Записывать <span style="color: red;">=</span> <span style="color: red;">Ложь</span><span style="color: red;">;</span>
</pre>
<br />
После выполнения повторного теста проблема взаимоблокировки ушла.</div>
</div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com0tag:blogger.com,1999:blog-7763816944206062403.post-38773890944111515872017-06-12T19:03:00.000+03:002018-07-30T11:58:21.347+03:00Где моя отладка, чувак?<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGnrjviNt52ncYPOv9vZM3Aiu6Eou5f0BSUVRbfa6Ku8Ozu2uBF9OWyXpBan-70cftYhYs6EZeSCdnY9AFAGlebE_W11l-KcUbxlz06wOlO76MxzVPXxUVsxDN5t_jAzv_kOSkGPPD3h-f/s1600/debug.png" imageanchor="1" style="clear: left; display: inline !important; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="100" data-original-width="109" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGnrjviNt52ncYPOv9vZM3Aiu6Eou5f0BSUVRbfa6Ku8Ozu2uBF9OWyXpBan-70cftYhYs6EZeSCdnY9AFAGlebE_W11l-KcUbxlz06wOlO76MxzVPXxUVsxDN5t_jAzv_kOSkGPPD3h-f/s1600/debug.png" /></a><br />
Обычно, когда отваливается отладка, первоначальными подозреваемыми становятся брандмауэр или антивирус. Соответственно, самый простой способ проверить их влияние на возникшую проблему - отключить их и запустить отладочный сеанс. Но в <a href="http://forum.infostart.ru/forum9/topic168403/" target="_blank">некоторых случаях</a> проблема может скрываться совершенно в другом месте. Общая рекомендация - не начинать бездумно применять все подряд "шаманские" способы из интернета, а в необходимом объеме собрать техническую информацию о возникающих событиях и ошибках, сопровождающих запуск отладки на исследуемой машине.<br />
<br />
<a name='more'></a>Теперь расскажу, как проходило расследование ситуации и последующая настройка сервера в моем случае. Для начала необходимо определить используемый на данный момент порт отладки. Это можно посмотреть в конфигураторе через меню "Отладка" - "Подключение" - "Настройка". В моем случае это было tcp://srv1c:1562.<br />
Выполнение <b><a href="https://ru.wikipedia.org/wiki/Netstat" target="_blank">netstat</a> -nao | find "1562"</b> показало, что к порту отладки имеют отношение только мои процессы конфигуратора и клиента, запущенного на отладку. Запуск периодического опроса портов <b>netstat -naot 1 | find "1562" </b>с последующим запуском отладки выявил наличие состояний SYN_SENT, что означает, что клиент все таки пытается достучаться порта отладки.<br />
После этого решил посмотреть, какие события пишет клиент во время запуска в технологический журнал. Поскольку мне неизвестно, какое событие будет содержать необходимую информацию, то я буду собирать все события с момента старта отладки до момента, пока SYS_SENT не прекратятся.<br />
<br />
<pre class="xml" style="font-family: monospace;"><span style="color: #009900;"><span style="color: black; font-weight: bold;"><config</span> <span style="color: #000066;">xmlns</span>=<span style="color: red;">"http://v8.1c.ru/v8/tech-log"</span><span style="color: black; font-weight: bold;">></span></span>
<span style="color: #009900;"><span style="color: black; font-weight: bold;"><log</span> <span style="color: #000066;">location</span>=<span style="color: red;">"C:\v8\client\logs"</span> <span style="color: #000066;">history</span>=<span style="color: red;">"1"</span><span style="color: black; font-weight: bold;">></span></span>
<span style="color: #009900;"><span style="color: black; font-weight: bold;"><event<span style="color: black; font-weight: bold;">></span></span></span>
<span style="color: #009900;"><span style="color: black; font-weight: bold;"><ne</span> <span style="color: #000066;">property</span>=<span style="color: red;">"name"</span> <span style="color: #000066;">value</span>=<span style="color: red;">""</span><span style="color: black; font-weight: bold;">/></span></span>
<span style="color: #009900;"><span style="color: black; font-weight: bold;"></event<span style="color: black; font-weight: bold;">></span></span></span>
<span style="color: #009900;"><span style="color: black; font-weight: bold;"><property</span> <span style="color: #000066;">name</span>=<span style="color: red;">"all"</span><span style="color: black; font-weight: bold;">></span></span>
<span style="color: #009900;"><span style="color: black; font-weight: bold;"></property<span style="color: black; font-weight: bold;">></span></span></span>
<span style="color: #009900;"><span style="color: black; font-weight: bold;"></log<span style="color: black; font-weight: bold;">></span></span></span>
<span style="color: #009900;"><span style="color: black; font-weight: bold;"></config<span style="color: black; font-weight: bold;">></span></span></span></pre>
<br />
Файл настроек журнала кладется в %UserProfile%\AppData\Local\1C\1cv8\conf, потому что мне нужны события только моих сеансов. После этого снова запускаем клиент на отладку и изучаем логи. В логе конфигуратора ничего интересного не оказалось. Из лога клиента целиком полученные данные приводить смысла нет, покажу только значимые события, связанные с сетевой активностью.<br />
<br />
<code>
<span style="color: #330099; font-weight: bold;">30</span>:<span style="color: #330099; font-weight: bold;">25.862000</span><span style="color: black;">-</span><span style="color: #330099; font-weight: bold;">0</span>,EXCP,<span style="color: #330099; font-weight: bold;">1</span>,process<span style="color: black;">=</span>1cv8,ClientID<span style="color: black;">=</span><span style="color: #330099; font-weight: bold;">0</span>,Exception<span style="color: black;">=</span>NetDataExchangeException,Descr<span style="color: black;">=</span><span style="color: maroon;">'server_addr=any:1560 descr=10048(0x00002740): Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт). line=261 file=src\DataExchangeServerImpl.cpp'</span> <br />
<span style="color: #330099; font-weight: bold;">30</span>:<span style="color: #330099; font-weight: bold;">25.862003</span><span style="color: black;">-</span><span style="color: #330099; font-weight: bold;">0</span>,EXCP,<span style="color: #330099; font-weight: bold;">1</span>,process<span style="color: black;">=</span>1cv8,ClientID<span style="color: black;">=</span><span style="color: #330099; font-weight: bold;">0</span>,Exception<span style="color: black;">=</span>NetDataExchangeException,Descr<span style="color: black;">=</span><span style="color: maroon;">'server_addr=any:1561 descr=10048(0x00002740): Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт). line=261 file=src\DataExchangeServerImpl.cpp'</span> <br />
<span style="color: #330099; font-weight: bold;">30</span>:<span style="color: #330099; font-weight: bold;">25.862006</span><span style="color: black;">-</span><span style="color: #330099; font-weight: bold;">0</span>,EXCP,<span style="color: #330099; font-weight: bold;">1</span>,process<span style="color: black;">=</span>1cv8,ClientID<span style="color: black;">=</span><span style="color: #330099; font-weight: bold;">0</span>,Exception<span style="color: black;">=</span>NetDataExchangeException,Descr<span style="color: black;">=</span><span style="color: maroon;">'server_addr=any:1562 descr=10048(0x00002740): Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт). line=261 file=src\DataExchangeServerImpl.cpp'</span> <br />
<span style="color: #330099; font-weight: bold;">30</span>:<span style="color: #330099; font-weight: bold;">30.199000</span><span style="color: black;">-</span><span style="color: #330099; font-weight: bold;">0</span>,EXCP,<span style="color: #330099; font-weight: bold;">3</span>,process<span style="color: black;">=</span>1cv8,Usr<span style="color: black;">=</span>Админ,ClientID<span style="color: black;">=</span><span style="color: #330099; font-weight: bold;">3</span>,Exception<span style="color: black;">=</span>NetDataExchangeException,Descr<span style="color: black;">=</span><span style="color: maroon;">'server_addr=tcp://127.0.0.1:1562 descr=127.0.0.1:1562:10060(0x0000274C): Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера. ; </span><br />
<span style="color: maroon;">line=1043 file=src\DataExchangeTcpClientImpl.cpp'</span> <br />
<span style="color: #330099; font-weight: bold;">30</span>:<span style="color: #330099; font-weight: bold;">34.208000</span><span style="color: black;">-</span><span style="color: #330099; font-weight: bold;">0</span>,EXCP,<span style="color: #330099; font-weight: bold;">3</span>,process<span style="color: black;">=</span>1cv8,Usr<span style="color: black;">=</span>Админ,ClientID<span style="color: black;">=</span><span style="color: #330099; font-weight: bold;">4</span>,Exception<span style="color: black;">=</span>NetDataExchangeException,Descr<span style="color: black;">=</span><span style="color: maroon;">'server_addr=tcp://127.0.0.1:1562 descr=127.0.0.1:1562:10060(0x0000274C): Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера. ; </span><br />
<span style="color: maroon;">line=1043 file=src\DataExchangeTcpClientImpl.cpp'</span></code><br />
<br />
Коды ошибок сокетов можно посмотреть на <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx" target="_blank">MSDN</a>. В моем случае ошибка <a href="https://support.microsoft.com/ru-ru/help/943710/winsock-error-message-when-you-use-a-program-that-tries-to-bind-to-tcp-network-ports-on-a-windows-based-computer-wsaeaddrinuse-10048" target="_blank">10048(0x00002740)</a> является причиной, 10060(0x0000274C) - следствие. Проблема оказалась знакомой - неделю назад настраивал другой сервер, на котором периодически отваливались клиенты с такой же ошибкой.<br />
Приступаем к <a href="https://msdn.microsoft.com/en-us/library/ee377084(v=bts.10).aspx" target="_blank">настройке TCP протокола</a> с помощью редактирования реестра (regedit), отсутствующие параметры в ветках необходимо создать руками:<br />
<br />
<a href="https://technet.microsoft.com/en-us/library/cc938196.aspx" target="_blank">MaxUserPort</a><br />
<br />
При соединение по TCP/IP открывается сокет и выбирается динамический порт. По умолчанию, диапазон динамических портов от 1024 по 5000. Увеличиваем до максимума.<br />
<br />
Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters<br />
Value: MaxUserPort<br />
Data Type: REG_DWORD<br />
Range: 5000 to 65534<br />
Default value: 5000<br />
Recommended value: 65534<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp4DO5Zfr_MJ-VdUOmTvYdpPqB_oEXWurFTc87hxXwGYeStx7iSNjv4Kr_LYl6j-p1f063sfYtVDnE_NxjUFifojNPuFmerNYxt6ttzP0XUSwrDL2XaW2WhWdqaMvxxYQ-zStOE4C4drnC/s1600/00002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="192" data-original-width="335" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp4DO5Zfr_MJ-VdUOmTvYdpPqB_oEXWurFTc87hxXwGYeStx7iSNjv4Kr_LYl6j-p1f063sfYtVDnE_NxjUFifojNPuFmerNYxt6ttzP0XUSwrDL2XaW2WhWdqaMvxxYQ-zStOE4C4drnC/s320/00002.png" width="320" /></a></div>
<br />
<a href="https://technet.microsoft.com/en-us/library/cc938217.aspx" target="_blank">TcpTimedWaitDelay</a><br />
<br />
Когда соединение TCP закрывается, то сокет сразу не освобождается, а переходит в статус TIME_WAIT и ресурсы освободятся только через определённое время. По умолчанию, только через 4 минуты. Снизим это время до минимума - 30 секунд.<br />
<br />
Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters<br />
Value: TcpTimedWaitDelay<br />
Data Type: REG_DWORD<br />
Range: 30 to 300<br />
Default value: 240<br />
Recommended value: 30<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwBpHhwzt5SaORQAcqi3DVCTB3BattsXtDsyjNA2I5DoSOVFlCQeXSKJWFgGofyENX4Qh6kOW45wTwoSdbKT6ma6hoZ1V4Hd5WDE9pzAgVaWwpQbLtI-4tEfT4ZuU6GIUR6kB9mW3rN6df/s1600/00002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="192" data-original-width="335" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwBpHhwzt5SaORQAcqi3DVCTB3BattsXtDsyjNA2I5DoSOVFlCQeXSKJWFgGofyENX4Qh6kOW45wTwoSdbKT6ma6hoZ1V4Hd5WDE9pzAgVaWwpQbLtI-4tEfT4ZuU6GIUR6kB9mW3rN6df/s320/00002.png" width="320" /></a></div>
<br />
Так же отключим автотюнинг tcp протокола:<br />
netsh int tcp set global autotuninglevel=disabled<br />
<br />
Выполненный ping srv1c показал использование протокола tcp/ipv6. Если в нем явной необходимости нет, то рекомендуется его отключить. Одного отключения протокола в свойствах подключения недостаточно, нужно еще отключить <a href="https://support.microsoft.com/ru-ru/help/929852/how-to-disable-ipv6-or-its-components-in-windows" target="_blank">компоненты</a>.<br />
<br />
Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters<br />
Value: DisabledComponents<br />
Data Type: REG_DWORD<br />
Value: 0xff<br />
<br />
На некоторых сайтах можно встретить рекомендацию установить значение 0xfffffff. Данное<br />
значение, согласно вышеуказанной статье от Microsoft, является некорректным и может привести к задержкам при загрузке системы (Additionally, system startup will be delayed for 5 seconds if IPv6 is disabled by incorrectly, setting the DisabledComponents registry setting to a value of 0xfffffff. The correct value should be 0xff).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieox-ZnZeOnORA70Uv1sfhpGUyLdikAME_88Z4qI4fcz4gQ6VA_GGy-LReTkzm3IPMn8Q3dN9lcAd2guNtgXuVkdxO36g4IByDR40lUP-VrToIycffCMVIVlWJfLvvz1gsH8R7IOuTswkK/s1600/00002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="192" data-original-width="335" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieox-ZnZeOnORA70Uv1sfhpGUyLdikAME_88Z4qI4fcz4gQ6VA_GGy-LReTkzm3IPMn8Q3dN9lcAd2guNtgXuVkdxO36g4IByDR40lUP-VrToIycffCMVIVlWJfLvvz1gsH8R7IOuTswkK/s320/00002.png" width="320" /></a></div>
<br />
Перезагружаем сервер. Мониторинг сервера в течении нескольких дней показал, что после проведенных изменений даже при большом количестве сессий 1С отладка перестала отваливаться.<br />
<br />
<a href="https://infostart.ru/public/633522" target="_blank">Публикация на infostart.ru</a></div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com1tag:blogger.com,1999:blog-7763816944206062403.post-61923981413543986622017-04-01T01:35:00.000+03:002017-04-03T14:20:41.963+03:00Знакомство с Docker'ами<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYOyaQ3Zt4c5wDP7dFeWKnpiCMZYI-S0dkgaujy08ISRPLVpN70AVB1f-H5AhxmvenyhbieBIdDU4nfDxvMJT7WogZvnD1YFqxUZHFv9Mu1lFMxvKgy4KY_uuwnkG-bUYynFmi0k9aue19/s1600/00012.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYOyaQ3Zt4c5wDP7dFeWKnpiCMZYI-S0dkgaujy08ISRPLVpN70AVB1f-H5AhxmvenyhbieBIdDU4nfDxvMJT7WogZvnD1YFqxUZHFv9Mu1lFMxvKgy4KY_uuwnkG-bUYynFmi0k9aue19/s1600/00012.png" /></a></div>
Собственно, руки давно уже чесались попробовать. Я часто использую <a href="https://www.virtualbox.org/" target="_blank">VirtualBox</a> для организации различного окружения под свои потребности, как на работе, так и дома. Общие плюсы виртуализации и конкретику Docker расписывать не буду, перейду сразу же к практической части.<br />
Развертывание под Windows возможно в двух вариантах:<br />
- <a href="https://docs.docker.com/docker-for-windows/install/" target="_blank">Docker for Windows</a> под Win 10 Pro 64x с включенным Hyper-V, позволяет использовать контейнеры под win/linux.<br />
- <a href="https://docs.docker.com/toolbox/overview/" target="_blank">DockerToolbox </a>под другие 64х ОС без поддержки или выключенным Hyper-V с использованием VirtualBox, работает только контейнерами под linux.<br />
Я хоть и сижу под необходимой версией, но поскольку VirtualBox не работает при включенном Hyper-V, то буду пробовать второй вариант.<br />
<a name='more'></a><br />
Тонкости установки DockerToolbox:<br />
- по умолчанию будет предложено установить VirtualBox и Git, установщик не контролирует наличия установленных программ.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSxIj26X6ESU-xV7R2B7CiMyG0OgKh_YTP7ATBQTHNDRWDCyLCWtyc4xsOP60lJxih0yecUHgSf8QiQN8YAlrJzqIGoqD5cdEWubPBbadpPVl8mQQU7C-q13DGX-fAwIad7MkZX_O_seSN/s1600/00001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSxIj26X6ESU-xV7R2B7CiMyG0OgKh_YTP7ATBQTHNDRWDCyLCWtyc4xsOP60lJxih0yecUHgSf8QiQN8YAlrJzqIGoqD5cdEWubPBbadpPVl8mQQU7C-q13DGX-fAwIad7MkZX_O_seSN/s1600/00001.png" /></a></div>
<br />
- в случае отказа от установки Git необходимо будет поменять путь к консоли (C:\Program Files\Git\bin\bash.exe) в свойствах ярлыка Docker Quickstart Terminal.<br />
- по умолчанию настройки docker и виртуальные машины сохраняются в %userprofile%\.docker. Есть несколько путей переназначения каталога, я в скрипте запуска start.sh добавил переопределение пути:<br />
export MACHINE_STORAGE_PATH="/i/!vm/docker"<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8FTD1JH1Qwssj4QO_OD2wJmZuWyn81GReM98NgcNeNj4gJTQooebF4MXA8wBrvPb9K4fPiUISPLmIc-xdgOKHYUkQEFiFFytL6g-1R3GcQacupM5U265fhJ4biJUfSz6AHmIwAr85OD-T/s1600/00002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8FTD1JH1Qwssj4QO_OD2wJmZuWyn81GReM98NgcNeNj4gJTQooebF4MXA8wBrvPb9K4fPiUISPLmIc-xdgOKHYUkQEFiFFytL6g-1R3GcQacupM5U265fhJ4biJUfSz6AHmIwAr85OD-T/s1600/00002.png" /></a></div>
<br />
Теперь запускаем Docker Quickstart Terminal и ждем, пока развернется виртуальная машина. После запуска можно в качестве теста выполнить команды:<br />
- docker version или docker info<br />
- скачать и запустить тестовый контейнер: docker run hello-world<br />
- получить список работающих контейнеров: docker ps<br />
- посмотреть все контейнеры: docker ps -a<br />
<br />
Теперь идем в <a href="https://store.docker.com/" target="_blank">Docker Store</a> и попробуем подобрать что-нибудь, связанное с 1С. Я выбрал для теста эти <a href="https://store.docker.com/community/images/temrdm/1c_server" target="_blank">сервер 1С</a> и <a href="https://store.docker.com/community/images/sibsau/postgres-pro-1c" target="_blank">СУБД Postgres</a>.<br />
<br />
Производим развертывание сервера 1С, выполняем в консоли:<br />
- docker pull temrdm/1c_server для получения последней версии (на текущий момент 8.3.8.2027)<br />
- docker create --name=1c_server_data -v /var/log/1c -v /home/usr1cv8/ temrdm/1c_server<br />
- docker run --restart=always -d --volumes-from 1c_server_data -v /etc/localtime:/etc/localtime:ro -p 1540-1541:1540-1541 -p 1560-1591:1560-1591 -h db temrdm/1c_server<br />
<br />
Разворачиваем Postgres:<br />
- docker pull sibsau/postgres-pro-1c<br />
- docker run --restart=always --name postgres_1c -e POSTGRES_PASSWORD=mysecretpassword -d sibsau/postgres-pro-1c, предварительно меняем mysecretpassword на необходимый пароль<br />
<br />
Выполняем docker ps, видим наши контейнеры:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMvKxcFsxxgJFAQxjk78B122zBd5KJVMoiJXFfEeSPTwDIdbW3gKD4ZCof8hItqNLj9vU5Alkcfwu78HNbp5vIXYRUMelEj8gTQIrah7g3XagXDqHqBnV6goZX6DtbKaJL0HECaBTfkece/s1600/00002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMvKxcFsxxgJFAQxjk78B122zBd5KJVMoiJXFfEeSPTwDIdbW3gKD4ZCof8hItqNLj9vU5Alkcfwu78HNbp5vIXYRUMelEj8gTQIrah7g3XagXDqHqBnV6goZX6DtbKaJL0HECaBTfkece/s1600/00002.png" /></a></div>
<br />
Теперь нам нужно получить IP адреса самой виртуальной машины и контейнеров, выполняем:<br />
docker-machine ip<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivWrYJ0x3NBAvBDmcZlQX92Tx1j2rzR8HuRg3S5Ylhs4RFbXaOJe5WgCLIPGo3QXl4Lghdo5Fmqho0_dbUn2g6JmzZ7HmjmMqWYnhVMMX-lWxmk9jZ5F5GHZ0HsHxcRPPKV7VxSUO0KwLC/s1600/00005.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivWrYJ0x3NBAvBDmcZlQX92Tx1j2rzR8HuRg3S5Ylhs4RFbXaOJe5WgCLIPGo3QXl4Lghdo5Fmqho0_dbUn2g6JmzZ7HmjmMqWYnhVMMX-lWxmk9jZ5F5GHZ0HsHxcRPPKV7VxSUO0KwLC/s1600/00005.png" /></a></div>
<br />
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwymNSlE5eBW8X6Lte2zW3aqxBuQqsa8q1xTJcqkKfLZvATJiQs1bVUh8iKW2OpNz0lkiJKvZpRa7WQFWDTs1BiUIKro_yOdbSCo1X9veNFX61fDrhvINHMMz5l0fk55GazBDvRmPcEXNo/s1600/00004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwymNSlE5eBW8X6Lte2zW3aqxBuQqsa8q1xTJcqkKfLZvATJiQs1bVUh8iKW2OpNz0lkiJKvZpRa7WQFWDTs1BiUIKro_yOdbSCo1X9veNFX61fDrhvINHMMz5l0fk55GazBDvRmPcEXNo/s1600/00004.png" /></a></div>
<br />
Теперь на нашем компьютере в консоли управления серверами 1С добавляем новый центральный сервер:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisOe0lPljFLNcoZT0wIF46BAGm7hxbPMyu43J59hzhdotKbdOQ5ISaePYly7LFtQsSrfG_xEg4HtLYO_Hkj6rIbMFp9VvVVGDKgCApWXnOaMfJ6K952Mah2iZqFjol-d8Gp_-0LJeaT3EA/s1600/00006.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisOe0lPljFLNcoZT0wIF46BAGm7hxbPMyu43J59hzhdotKbdOQ5ISaePYly7LFtQsSrfG_xEg4HtLYO_Hkj6rIbMFp9VvVVGDKgCApWXnOaMfJ6K952Mah2iZqFjol-d8Gp_-0LJeaT3EA/s1600/00006.png" /></a></div>
<br />
Пробуем добавить новую базу<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI3Ot-eW8T8tRFXtoxCDGFSNo5nibQajGBfb79yu8znXR-pXP1nVhIxmed0rtPCV3ZlazBY5IALGAPrPsC9vb4Vb3wLbEWkdH4utazShAI9gDat8Q20YiMm-bwcYre7ypU-gweUKpkeE6F/s1600/00007.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="276" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI3Ot-eW8T8tRFXtoxCDGFSNo5nibQajGBfb79yu8znXR-pXP1nVhIxmed0rtPCV3ZlazBY5IALGAPrPsC9vb4Vb3wLbEWkdH4utazShAI9gDat8Q20YiMm-bwcYre7ypU-gweUKpkeE6F/s320/00007.png" width="320" /></a></div>
<br />
<br />
Если получаем ошибку,<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJb7xYsWwnzL7PLKHIiLiIV8vaiIbPB8Y_yCM3ZGcjN26eNfMS1Tc8acp6f8yGbfh5uY-lg2Aozs36nyayjo5yo05IklWgVijVjRMo4W9Xy1OO6pRMp-3qS-yYW8X-3DW9yarMqjqjvagS/s1600/00008.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJb7xYsWwnzL7PLKHIiLiIV8vaiIbPB8Y_yCM3ZGcjN26eNfMS1Tc8acp6f8yGbfh5uY-lg2Aozs36nyayjo5yo05IklWgVijVjRMo4W9Xy1OO6pRMp-3qS-yYW8X-3DW9yarMqjqjvagS/s1600/00008.png" /></a></div>
<br />
то в файле C:\Windows\System32\drivers\etc\hosts прописываем соответствие IP и имени сервера:<br />
192.168.99.101<span class="Apple-tab-span" style="white-space: pre;"> </span>db<br />
<br />
После чего повторяем создание базы. Для проверки набросал небольшую обработку для вывода системной информации сервера 1С.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYfJBshm3dW7ii19ITJCs-Hh7vQ4WYsOLd25EOUqxaSqb0Myxz7a3N0VXpzghRMv4AZueCOJiIRMUmd2A97BIf6N20yF1H8GjEcG8ifUa-L6iOlwouVgckIY2yvp0l1yMJHbd2OPxbkkbO/s1600/00009.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYfJBshm3dW7ii19ITJCs-Hh7vQ4WYsOLd25EOUqxaSqb0Myxz7a3N0VXpzghRMv4AZueCOJiIRMUmd2A97BIf6N20yF1H8GjEcG8ifUa-L6iOlwouVgckIY2yvp0l1yMJHbd2OPxbkkbO/s1600/00009.png" /></a></div>
<br />
Теперь попробуем создать свой контейнер с сервером 1С. Для этого нам понадобится Dockerfile, содержащий скрипт подготовки контейнера и файлы дистрибутива сервера 64x под Linux. Так же, поскольку у меня уже есть один сервер 1С, то скрипты сборки нового сервера настрою так, что бы он запускался на других портах.<br />
<br />
Я взял за основу репозитарий <a href="https://github.com/temrdm/1c_server" target="_blank">temrdm/1c_server</a>. Полученный архив распаковывается в любой каталог, например d:\docker-1c-server-master. Готовим структуру каталогов по приложенной инструкции:<br />
1) создаем каталог необходимой версии сервера, например d:\docker-1c-server-master\8.3.9-2170<br />
2) создаем внутри него каталог dist<br />
3) качаем deb-based дистрибутив сервера 1С и распаковываем в dist<br />
4) копируем файлы скриптов из каталога другой версии<br />
5) настраиваем файлы:<br />
- Dockerfile, меняем значение ENV SERVER_1C_VERSION на нашу версию<br />
- docker-entrypoint.sh, настраиваем порты: exec gosu usr1cv8 /opt/1C/v8.3/x86_64/ragent /port 2540 /regport 2541 /range 2560:2591<br />
6) в консоли Docker Quickstart Terminal выполняем:<br />
- cd d:\docker-1c-server-master<br />
- docker build -t mickey1cx/srv_1c ./8.3.9-2170, ждем пока соберется образ<br />
- docker create --name=1c_srv_data -v /var/log/1c -v /home/usr1cv8/ mickey1cx/srv_1c<br />
- docker run --restart=always -d --volumes-from 1c_srv_data -v /etc/localtime:/etc/localtime:ro -p 2540-2541:2540-2541 -p 2560-2591:2560-2591 -h db2 mickey1cx/srv_1c<br />
<br />
Готово, выполняем docker ps, убеждаемся, что контейнер стартовал.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6XqljU6qg59jCh23AbokkL1p7Os15BptBYlIW0EaSjtZZ_eXJFixwi7wV3zN2kgdfv3qFJIcK_zMgeKRiFPGj6FgLVymbDGH31UYRVHTaklDuqFLB7aaHg1KEpXXdGgZ2GAhO4fUjKgjv/s1600/00010.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="88" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6XqljU6qg59jCh23AbokkL1p7Os15BptBYlIW0EaSjtZZ_eXJFixwi7wV3zN2kgdfv3qFJIcK_zMgeKRiFPGj6FgLVymbDGH31UYRVHTaklDuqFLB7aaHg1KEpXXdGgZ2GAhO4fUjKgjv/s640/00010.png" width="640" /></a></div>
<br />
Для проверки создаю базу на новом сервере и запускаю обработку:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7__RubcBUTW2t7CNah5D3xNnaKzCL3Rp8a9ScqX4DufY255T0HIGrCUKAwcP0297NhJUhHuO7B_G5AeujHFkbOgb-bZN4qYO07y5GUhAOvH23n-7W016kDuydo46L_EOFqmBzg5V7aeRn/s1600/00011.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7__RubcBUTW2t7CNah5D3xNnaKzCL3Rp8a9ScqX4DufY255T0HIGrCUKAwcP0297NhJUhHuO7B_G5AeujHFkbOgb-bZN4qYO07y5GUhAOvH23n-7W016kDuydo46L_EOFqmBzg5V7aeRn/s1600/00011.png" /></a></div>
<br />
Помимо этого можно поднять web-интерфейс для docker, например <a href="https://hub.docker.com/r/portainer/portainer/" target="_blank">Portainer</a>:<br />
- docker pull portainer/portainer<br />
- docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer<br />
После этого можно в браузере перейти по адресу <docker-machine IP>:9000, (например, http://192.168.99.100:9000), задать пароль администратора и пользоваться.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1hCy-WRhvvZhblVuJo4-0dZyzOgPrlrYHTQBPi4K8XpsDa66XJHTnLOnu4-Q19_AuKDg3otkndDSUF5-Oja1HMPp9hcl_7ho5Wrm_Jogl0lRXDIGDHbHMvfLUVWKOKFfNBn5LFbRBRVh1/s1600/00012.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="440" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1hCy-WRhvvZhblVuJo4-0dZyzOgPrlrYHTQBPi4K8XpsDa66XJHTnLOnu4-Q19_AuKDg3otkndDSUF5-Oja1HMPp9hcl_7ho5Wrm_Jogl0lRXDIGDHbHMvfLUVWKOKFfNBn5LFbRBRVh1/s640/00012.png" width="640" /></a></div>
<br />
Ссылки по теме:<br />
<a href="https://habrahabr.ru/post/253877" target="_blank">Понимая Docker</a><br />
<a href="https://habrahabr.ru/post/277699" target="_blank">Поняв Docker</a><br />
<a href="https://system-admins.ru/1s-v-kontejnere-bystro-nedorogo" target="_blank">1С в контейнере. Быстро и недорого.</a><br />
<br /></div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com1tag:blogger.com,1999:blog-7763816944206062403.post-42749940084628166962017-03-06T22:05:00.002+03:002019-06-30T20:01:19.114+03:00Проблемы производительности. Фрагментация индексов.<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_v4scJ45TX6YvmdTvVM2GAU7vBG_4TAc7ZZ6hxWvhF61fw7mdfoFXr73iZJQo2erb2OpibCTdH1IbMGPDj97-Y36qxbRUKiX8dhTBjSmjDx9MW5yap_wz8h7JdYk14Zxk-syjcEABqpJ7/s1600/Auslogics-Disk-Defrag-Software-Image.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_v4scJ45TX6YvmdTvVM2GAU7vBG_4TAc7ZZ6hxWvhF61fw7mdfoFXr73iZJQo2erb2OpibCTdH1IbMGPDj97-Y36qxbRUKiX8dhTBjSmjDx9MW5yap_wz8h7JdYk14Zxk-syjcEABqpJ7/s1600/Auslogics-Disk-Defrag-Software-Image.png" /></a></div>
Недавно на практике получилось увидеть влияние чрезмерной фрагментации индексов на производительность базы, конфигурация 1С: ERP. Ранее я читал, что излишняя фрагментация влияет на скорость выполнения операций INSERT, UPDATE, DELETE, в чем и удалось убедиться. Как обычно бывает, проблему обрисовали в общих чертах - у клиента тормозит база. В таких случаях, когда не известно, с чего начать - начинаем с настройки сбора данных по счетчикам производительности и технологического журнала. В моем случае анализ данных по счетчикам производительности проблем загруженности оборудования не выявил. Так же в существующие настройки техжурнала была добавлена секция для сбора событий с длительностью, превышающей три секунды.<br />
<a name='more'></a><br />
<pre style="color: blue;"><code class="undefined"> <log location="e:\tech_log\long_events" history="4">
<event>
<ne property="name" value=""/>
<ge property="Durationus" value="3000000"/>
</event>
<property name="all"/>
</log></code></pre>
<br />
В полученном логе внимание привлекли события DBMSSQL, содержащие текст запроса с командой INSERT в таблицы документов. Поскольку на работу в других базах на этом сервере не жаловались, было решено проверить <a href="https://msdn.microsoft.com/ru-ru/library/ms189858.aspx#Fragmentation" target="_blank">фрагментацию индексов</a> проблемной базы.<br />
<br />
<pre style="background: #ffffff; color: black;"><span style="color: #3f7f59;">--use name_of_base -- указываем имя базы для анализа</span>
<span style="color: #7f0055; font-weight: bold;">SELECT</span>
TableName = <span style="color: #7f0055; font-weight: bold;">OBJECT_NAME</span>(<span style="color: #7f0055; font-weight: bold;">s</span>.[<span style="color: #7f0055; font-weight: bold;">object_id</span>]),
IndexName = <span style="color: #7f0055; font-weight: bold;">i</span>.name,
<span style="color: #7f0055; font-weight: bold;">i</span>.type_desc,
[Fragmentation %] = <span style="color: #7f0055; font-weight: bold;">ROUND</span>(avg_fragmentation_in_percent,2),
page_count,
partition_number,
<span style="color: #2a00ff;">'alter index ['</span> + <span style="color: #7f0055; font-weight: bold;">i</span>.name + <span style="color: #2a00ff;">'] on ['</span> + sh.name + <span style="color: #2a00ff;">'].['</span>+ <span style="color: #7f0055; font-weight: bold;">OBJECT_NAME</span>(<span style="color: #7f0055; font-weight: bold;">s</span>.[<span style="color: #7f0055; font-weight: bold;">object_id</span>]) + <span style="color: #2a00ff;">'] REBUILD'</span> +
<span style="color: #7f0055; font-weight: bold;">case</span>
<span style="color: #7f0055; font-weight: bold;">when</span> p.data_space_id <span style="color: #7f0055; font-weight: bold;">is</span> <span style="color: #7f0055; font-weight: bold;">not</span> <span style="color: #7f0055; font-weight: bold;">null</span> <span style="color: #7f0055; font-weight: bold;">then</span> <span style="color: #2a00ff;">' PARTITION = '</span>+<span style="color: #7f0055; font-weight: bold;">convert</span>(<span style="color: #7f0055; font-weight: bold;">varchar</span>(100),partition_number)
<span style="color: #7f0055; font-weight: bold;">else</span> <span style="color: #2a00ff;">''</span>
<span style="color: #7f0055; font-weight: bold;">end</span> + <span style="color: #2a00ff;">' with(maxdop = 4, SORT_IN_TEMPDB = on)'</span> [<span style="color: #7f0055; font-weight: bold;">sql</span>]
<span style="color: #7f0055; font-weight: bold;">FROM</span> <span style="color: #7f0055; font-weight: bold;">sys</span>.dm_db_index_physical_stats(db_id(),<span style="color: #7f0055; font-weight: bold;">null</span>, <span style="color: #7f0055; font-weight: bold;">null</span>, <span style="color: #7f0055; font-weight: bold;">null</span>, <span style="color: #7f0055; font-weight: bold;">null</span>) <span style="color: #7f0055; font-weight: bold;">s</span>
<span style="color: #7f0055; font-weight: bold;">INNER</span> <span style="color: #7f0055; font-weight: bold;">JOIN</span> <span style="color: #7f0055; font-weight: bold;">sys</span>.<span style="color: #7f0055; font-weight: bold;">indexes</span> <span style="color: #7f0055; font-weight: bold;">as</span> <span style="color: #7f0055; font-weight: bold;">i</span> <span style="color: #7f0055; font-weight: bold;">ON</span> <span style="color: #7f0055; font-weight: bold;">s</span>.[<span style="color: #7f0055; font-weight: bold;">object_id</span>] = <span style="color: #7f0055; font-weight: bold;">i</span>.[<span style="color: #7f0055; font-weight: bold;">object_id</span>] <span style="color: #7f0055; font-weight: bold;">AND</span> <span style="color: #7f0055; font-weight: bold;">s</span>.index_id = <span style="color: #7f0055; font-weight: bold;">i</span>.index_id
<span style="color: #7f0055; font-weight: bold;">left</span> <span style="color: #7f0055; font-weight: bold;">join</span> <span style="color: #7f0055; font-weight: bold;">sys</span>.partition_schemes <span style="color: #7f0055; font-weight: bold;">as</span> p <span style="color: #7f0055; font-weight: bold;">on</span> <span style="color: #7f0055; font-weight: bold;">i</span>.data_space_id = p.data_space_id
<span style="color: #7f0055; font-weight: bold;">left</span> <span style="color: #7f0055; font-weight: bold;">join</span> <span style="color: #7f0055; font-weight: bold;">sys</span>.objects o <span style="color: #7f0055; font-weight: bold;">on</span> <span style="color: #7f0055; font-weight: bold;">s</span>.[<span style="color: #7f0055; font-weight: bold;">object_id</span>] = o.[<span style="color: #7f0055; font-weight: bold;">object_id</span>]
<span style="color: #7f0055; font-weight: bold;">left</span> <span style="color: #7f0055; font-weight: bold;">join</span> <span style="color: #7f0055; font-weight: bold;">sys</span>.schemas <span style="color: #7f0055; font-weight: bold;">as</span> sh <span style="color: #7f0055; font-weight: bold;">on</span> sh.[schema_id] = o.[schema_id]
<span style="color: #7f0055; font-weight: bold;">WHERE</span> <span style="color: #7f0055; font-weight: bold;">s</span>.database_id = DB_ID() <span style="color: #7f0055; font-weight: bold;">AND</span>
<span style="color: #7f0055; font-weight: bold;">i</span>.name <span style="color: #7f0055; font-weight: bold;">IS</span> <span style="color: #7f0055; font-weight: bold;">NOT</span> <span style="color: #7f0055; font-weight: bold;">NULL</span> <span style="color: #7f0055; font-weight: bold;">AND</span>
<span style="color: #7f0055; font-weight: bold;">OBJECTPROPERTY</span>(<span style="color: #7f0055; font-weight: bold;">s</span>.[<span style="color: #7f0055; font-weight: bold;">object_id</span>], <span style="color: #2a00ff;">'IsMsShipped'</span>) = 0 <span style="color: #7f0055; font-weight: bold;">and</span>
page_count > 100 <span style="color: #7f0055; font-weight: bold;">and</span>
avg_fragmentation_in_percent > 10
<span style="color: #7f0055; font-weight: bold;">ORDER</span> <span style="color: #7f0055; font-weight: bold;">BY</span> 4 <span style="color: #7f0055; font-weight: bold;">desc</span>
</pre>
<br />
Результат скрипта впечатлил - фрагментация по таблицам, так или иначе участвующих в проблемных операциях, достигала 90%. После устранения данной проблемы длительные события DBMSSQL ушли из лога техжурнала, пользователи подтвердили восстановление приемлемой скорости работы.<br />
<br />
Начали разбираться с настройкой планов обслуживания сервера SQL. Операции обслуживания индексов были настроены по схеме в воскресенье - перестроение индекса (ALTER INDEX REBUILD), в остальные дни - реорганизация (ALTER INDEX REORGANIZE). Вроде бы нормально, но в настройках перестроения был указан флаг "Сохранять индексы в сети", что работает только для <a href="https://msdn.microsoft.com/ru-ru/library/cc645993.aspx" target="_blank">MS SQL Enterprise Edition</a>. В следствие чего перестроение не происходило вообще.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjazc2ByuwIUR4MRiRXLaso6exq1x47CZtqLR-4cXifBeKW-ZGUxlbDvE5U6Y_RcTJ04HVgD64ImCRe9S4km5PcO8WXwaTJ4_3vKCOrAO7PjI35ehlFhy-tkdnklNJ1mrRraucBSTJvw_R8/s1600/sql_plan.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjazc2ByuwIUR4MRiRXLaso6exq1x47CZtqLR-4cXifBeKW-ZGUxlbDvE5U6Y_RcTJ04HVgD64ImCRe9S4km5PcO8WXwaTJ4_3vKCOrAO7PjI35ehlFhy-tkdnklNJ1mrRraucBSTJvw_R8/s1600/sql_plan.png" /></a></div>
<br />
Так же был произведен анализ роста фрагментации в течении дня. Оказалось, что 1С: ERP может за несколько часов увеличить этот показатель до 90%. Поэтому в ежедневное обслуживание продуктивной базы был добавлен следующий скрипт, с запуском за час до начала рабочего дня и в обед:<br />
<br />
<pre style="background: #ffffff; color: black;"><span style="color: #7f0055; font-weight: bold;">USE</span> current_work_base <span style="color: #3f7f59;">-- устанавливаем текущую базу</span>
<span style="color: #7f0055; font-weight: bold;">SET</span> NOCOUNT <span style="color: #7f0055; font-weight: bold;">ON</span>; <span style="color: #3f7f59;">-- отключаем вывод количества возвращаемых строк, это несколько ускорит обработку</span>
<span style="color: #7f0055; font-weight: bold;">DECLARE</span> @objectid <span style="color: #7f0055; font-weight: bold;">int</span>; <span style="color: #3f7f59;">-- ID объекта</span>
<span style="color: #7f0055; font-weight: bold;">DECLARE</span> @indexid <span style="color: #7f0055; font-weight: bold;">int</span>; <span style="color: #3f7f59;">-- ID индекса</span>
<span style="color: #7f0055; font-weight: bold;">DECLARE</span> @partitioncount <span style="color: #7f0055; font-weight: bold;">bigint</span>; <span style="color: #3f7f59;">-- количество секций если индекс секционирован</span>
<span style="color: #7f0055; font-weight: bold;">DECLARE</span> @schemaname nvarchar(130); <span style="color: #3f7f59;">-- имя схемы в которой находится таблица</span>
<span style="color: #7f0055; font-weight: bold;">DECLARE</span> @objectname nvarchar(130); <span style="color: #3f7f59;">-- имя таблицы </span>
<span style="color: #7f0055; font-weight: bold;">DECLARE</span> @indexname nvarchar(130); <span style="color: #3f7f59;">-- имя индекса</span>
<span style="color: #7f0055; font-weight: bold;">DECLARE</span> @partitionnum <span style="color: #7f0055; font-weight: bold;">bigint</span>; <span style="color: #3f7f59;">-- номер секции</span>
<span style="color: #7f0055; font-weight: bold;">DECLARE</span> @frag <span style="color: #7f0055; font-weight: bold;">float</span>; <span style="color: #3f7f59;">-- процент фрагментации индекса</span>
<span style="color: #7f0055; font-weight: bold;">DECLARE</span> @command nvarchar(4000); <span style="color: #3f7f59;">-- инструкция T-SQL для дефрагментации либо ренидексации</span>
<span style="color: #3f7f59;">-- Отбор таблиц и индексов с помощью системного представления sys.dm_db_index_physical_stats</span>
<span style="color: #3f7f59;">-- Отбор только тех объектов которые являются индексами (index_id > 0), </span>
<span style="color: #3f7f59;">-- фрагментация которых более 10% и количество страниц в индексе более 128</span>
<span style="color: #7f0055; font-weight: bold;">SELECT</span>
<span style="color: #7f0055; font-weight: bold;">object_id</span> <span style="color: #7f0055; font-weight: bold;">AS</span> objectid,
index_id <span style="color: #7f0055; font-weight: bold;">AS</span> indexid,
partition_number <span style="color: #7f0055; font-weight: bold;">AS</span> partitionnum,
avg_fragmentation_in_percent <span style="color: #7f0055; font-weight: bold;">AS</span> frag
<span style="color: #7f0055; font-weight: bold;">INTO</span> #work_to_do
<span style="color: #7f0055; font-weight: bold;">FROM</span> <span style="color: #7f0055; font-weight: bold;">sys</span>.dm_db_index_physical_stats (DB_ID(), <span style="color: #7f0055; font-weight: bold;">NULL</span>, <span style="color: #7f0055; font-weight: bold;">NULL</span> , <span style="color: #7f0055; font-weight: bold;">NULL</span>, <span style="color: #2a00ff;">'LIMITED'</span>)
<span style="color: #7f0055; font-weight: bold;">WHERE</span> avg_fragmentation_in_percent > 10.0 <span style="color: #7f0055; font-weight: bold;">AND</span> index_id > 0 <span style="color: #7f0055; font-weight: bold;">AND</span> page_count > 128;
<span style="color: #3f7f59;">-- Объявление курсора для чтения секций</span>
<span style="color: #7f0055; font-weight: bold;">DECLARE</span> <span style="color: #7f0055; font-weight: bold;">partitions</span> <span style="color: #7f0055; font-weight: bold;">CURSOR</span> <span style="color: #7f0055; font-weight: bold;">FOR</span> <span style="color: #7f0055; font-weight: bold;">SELECT</span> * <span style="color: #7f0055; font-weight: bold;">FROM</span> #work_to_do;
<span style="color: #3f7f59;">-- Открытие курсора</span>
<span style="color: #7f0055; font-weight: bold;">OPEN</span> <span style="color: #7f0055; font-weight: bold;">partitions</span>;
<span style="color: #3f7f59;">-- Цикл по секциям</span>
<span style="color: #7f0055; font-weight: bold;">WHILE</span> (1=1)
<span style="color: #7f0055; font-weight: bold;">BEGIN</span>;
<span style="color: #7f0055; font-weight: bold;">FETCH</span> <span style="color: #7f0055; font-weight: bold;">NEXT</span>
<span style="color: #7f0055; font-weight: bold;">FROM</span> <span style="color: #7f0055; font-weight: bold;">partitions</span>
<span style="color: #7f0055; font-weight: bold;">INTO</span> @objectid, @indexid, @partitionnum, @frag;
<span style="color: #7f0055; font-weight: bold;">IF</span> @@FETCH_STATUS < 0 <span style="color: #7f0055; font-weight: bold;">BREAK</span>;
<span style="color: #3f7f59;">-- Собираем имена объектов по ID </span>
<span style="color: #7f0055; font-weight: bold;">SELECT</span> @objectname = <span style="color: #7f0055; font-weight: bold;">QUOTENAME</span>(o.name), @schemaname = <span style="color: #7f0055; font-weight: bold;">QUOTENAME</span>(<span style="color: #7f0055; font-weight: bold;">s</span>.name)
<span style="color: #7f0055; font-weight: bold;">FROM</span> <span style="color: #7f0055; font-weight: bold;">sys</span>.objects <span style="color: #7f0055; font-weight: bold;">AS</span> o
<span style="color: #7f0055; font-weight: bold;">JOIN</span> <span style="color: #7f0055; font-weight: bold;">sys</span>.schemas <span style="color: #7f0055; font-weight: bold;">as</span> <span style="color: #7f0055; font-weight: bold;">s</span> <span style="color: #7f0055; font-weight: bold;">ON</span> <span style="color: #7f0055; font-weight: bold;">s</span>.schema_id = o.schema_id
<span style="color: #7f0055; font-weight: bold;">WHERE</span> o.<span style="color: #7f0055; font-weight: bold;">object_id</span> = @objectid;
<span style="color: #7f0055; font-weight: bold;">SELECT</span> @indexname = <span style="color: #7f0055; font-weight: bold;">QUOTENAME</span>(name)
<span style="color: #7f0055; font-weight: bold;">FROM</span> <span style="color: #7f0055; font-weight: bold;">sys</span>.<span style="color: #7f0055; font-weight: bold;">indexes</span>
<span style="color: #7f0055; font-weight: bold;">WHERE</span> <span style="color: #7f0055; font-weight: bold;">object_id</span> = @objectid <span style="color: #7f0055; font-weight: bold;">AND</span> index_id = @indexid;
<span style="color: #7f0055; font-weight: bold;">SELECT</span> @partitioncount = <span style="color: #7f0055; font-weight: bold;">count</span> (*)
<span style="color: #7f0055; font-weight: bold;">FROM</span> <span style="color: #7f0055; font-weight: bold;">sys</span>.<span style="color: #7f0055; font-weight: bold;">partitions</span>
<span style="color: #7f0055; font-weight: bold;">WHERE</span> <span style="color: #7f0055; font-weight: bold;">object_id</span> = @objectid <span style="color: #7f0055; font-weight: bold;">AND</span> index_id = @indexid;
<span style="color: #3f7f59;">-- Если фрагментация менее или равна 30% тогда дефрагментация, иначе реиндексация</span>
<span style="color: #7f0055; font-weight: bold;">IF</span> @frag <= 30.0
<span style="color: #7f0055; font-weight: bold;">SET</span> @command = N<span style="color: #2a00ff;">'ALTER INDEX '</span> + @indexname + N<span style="color: #2a00ff;">' ON '</span> + @schemaname + N<span style="color: #2a00ff;">'.'</span> + @objectname + N<span style="color: #2a00ff;">' REORGANIZE'</span>;
<span style="color: #7f0055; font-weight: bold;">IF</span> @frag > 30.0
<span style="color: #7f0055; font-weight: bold;">SET</span> @command = N<span style="color: #2a00ff;">'ALTER INDEX '</span> + @indexname + N<span style="color: #2a00ff;">' ON '</span> + @schemaname + N<span style="color: #2a00ff;">'.'</span> + @objectname + N<span style="color: #2a00ff;">' REBUILD'</span>;
<span style="color: #7f0055; font-weight: bold;">IF</span> @partitioncount > 1
<span style="color: #7f0055; font-weight: bold;">SET</span> @command = @command + N<span style="color: #2a00ff;">' PARTITION='</span> + <span style="color: #7f0055; font-weight: bold;">CAST</span>(@partitionnum <span style="color: #7f0055; font-weight: bold;">AS</span> nvarchar(10));
<span style="color: #3f7f59;">-- Если реиндексация, то для ускорения добавляем параметры использования TEMPDB(имеет смысл только если TempDB на отдельном физ. диске) и многопроцессорной обработки </span>
<span style="color: #7f0055; font-weight: bold;">IF</span> @frag > 30.0
<span style="color: #7f0055; font-weight: bold;">SET</span> @command = @command + N<span style="color: #2a00ff;">' WITH (SORT_IN_TEMPDB = ON, MAXDOP = 0)'</span>;
<span style="color: #7f0055; font-weight: bold;">EXEC</span> (@command);
<span style="color: #7f0055; font-weight: bold;">PRINT</span> N<span style="color: #2a00ff;">'Executed: '</span> + @command;
<span style="color: #7f0055; font-weight: bold;">END</span>;
<span style="color: #3f7f59;">-- Закрытие курсора</span>
<span style="color: #7f0055; font-weight: bold;">CLOSE</span> <span style="color: #7f0055; font-weight: bold;">partitions</span>;
<span style="color: #7f0055; font-weight: bold;">DEALLOCATE</span> <span style="color: #7f0055; font-weight: bold;">partitions</span>;
<span style="color: #3f7f59;">-- Удаление временной таблицы</span>
<span style="color: #7f0055; font-weight: bold;">DROP</span> <span style="color: #7f0055; font-weight: bold;">TABLE</span> #work_to_do;
<span style="color: #7f0055; font-weight: bold;">GO</span>
</pre>
<br />
Рекомендуется к прочтению:<br />
<a href="https://habrahabr.ru/post/209698/" target="_blank">План обслуживания «на каждый день» – Часть 1: Автоматическая дефрагментация индексов</a><br />
<a href="http://www.gilev.ru/index/" target="_blank">Зачем разработчику 1С «индексировать» измерения регистров и реквизиты?</a><br />
<a href="http://1sprogress.ru/texnologicheskij-zhurnal-ot-a-do-ya.html" target="_blank">Технологический журнал от «А» до «Я»</a><br />
<br />
Следите за вашими индексами, коллеги :)<br />
<br /></div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com8tag:blogger.com,1999:blog-7763816944206062403.post-36200334724173599332017-02-12T00:31:00.002+03:002021-09-30T14:47:14.676+03:00Произвольная иерархия в СКД: вывод дерева значений<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifVhvAspUGnvFMbK_9OhALQwKdNvoraWrBn44haUiVlVugU2Vl0XPR-cfzzya-jlpRsYRHZelVsxWdFrzDX3dAM9gjwOIYWzEObzdmg1ULWonLw3Kj5CynlH2WVfRB9hRfedwexklpfoY8/s1600/40670856.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifVhvAspUGnvFMbK_9OhALQwKdNvoraWrBn44haUiVlVugU2Vl0XPR-cfzzya-jlpRsYRHZelVsxWdFrzDX3dAM9gjwOIYWzEObzdmg1ULWonLw3Kj5CynlH2WVfRB9hRfedwexklpfoY8/s1600/40670856.png" /></a></div>
<br />
Просматривал утром статистику посещений блога, наткнулся на переход с <a href="http://forum.infostart.ru/forum9/topic166492" target="_blank">форума Инфостарта</a>, из темы про сохранение дерева значений в табличный документ. Самый простой способ - рекурсивный обход строк дерева, автор так и поступил. Но тема перекликается с моей предыдущей статьей о произвольной иерархии СКД, только использование внешних наборов данных в ней не рассматривается. Поэтому решил исправить данный недостаток и набросать небольшой пример вывода дерева значений с помощью системы компоновки данных.<br />
<a name='more'></a><br />
При использовании дерева значений в качестве внешнего набора данных для схемы компоновки связи дочерних строк с родительскими не передаются. Поэтому, чтобы сохранить эти связи, в дерево необходимо добавить служебные поля для хранения идентификатора строки и идентификатора родителя. Заполнять эти поля стоит в процессе формирования дерева.<br />
<br />
Для демонстрации создам обработку, содержащую дерево значений, которое будет редактироваться на форме и табличный документ для вывода результата.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb9iUHiH1z8Q2qI86DRFhm-QvL0B2CYdAu4O6l77iSYDX5Nz7-X9N_9trTp9COgkbYGrEROBn_myMJ_jlAmIivmsuPNlGCzC7A0C4QXoTJ5I765lyswyhjZiw_e2hJHRCSLRPEcepajnQx/s1600/000001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="307" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb9iUHiH1z8Q2qI86DRFhm-QvL0B2CYdAu4O6l77iSYDX5Nz7-X9N_9trTp9COgkbYGrEROBn_myMJ_jlAmIivmsuPNlGCzC7A0C4QXoTJ5I765lyswyhjZiw_e2hJHRCSLRPEcepajnQx/s640/000001.png" width="640" /></a></div>
<br />
<br />
Реализуем заполнение служебных полей. ИД родителя для корневой строки буду считать равным нулю, поэтому все остальные ИД строк сохраняю с увеличением на единицу.<br />
<pre style="color: blue;"><code class="_1c8"><span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Процедура</span> Т_ПриНачалеРедактирования<span style="color: red;">(</span>Элемент<span style="color: red;">,</span> НоваяСтрока<span style="color: red;">,</span> Копирование<span style="color: red;">)</span>
<span style="color: red;">Если</span> НоваяСтрока <span style="color: red;">Тогда</span>
ТекущиеДанные <span style="color: red;">=</span> Элемент<span style="color: red;">.</span>ТекущиеДанные<span style="color: red;">;</span>
ТекущиеДанные<span style="color: red;">.</span>Ид <span style="color: red;">=</span> ТекущиеДанные<span style="color: red;">.</span>ПолучитьИдентификатор<span style="color: red;">(</span><span style="color: red;">)</span> <span style="color: red;">+</span> <span style="color: black;">1</span><span style="color: red;">;</span>
ТекущиеДанныеРодитель <span style="color: red;">=</span> ТекущиеДанные<span style="color: red;">.</span>ПолучитьРодителя<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
ТекущиеДанные<span style="color: red;">.</span>РодительИд <span style="color: red;">=</span> <span style="color: red;">?</span><span style="color: red;">(</span>ТекущиеДанныеРодитель <span style="color: red;">=</span> <span style="color: red;">Неопределено</span><span style="color: red;">,</span> <span style="color: black;">0</span><span style="color: red;">,</span> ТекущиеДанныеРодитель<span style="color: red;">.</span>ПолучитьИдентификатор<span style="color: red;">(</span><span style="color: red;">)</span> <span style="color: red;">+</span> <span style="color: black;">1</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецЕсли</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
</code></pre>
Теперь сделаем вывод дерева в компоновку. Сначала хотел показать, как настроить схему компоновки в редакторе, но потом решил добавить немного универсальности и генерировать ее программно на основании дерева значений.<br />
<pre style="color: blue;"><code class="_1c8"><span style="color: brown;">&НаСервере</span>
<span style="color: red;">Процедура</span> СформироватьТабличныйДокументНаСервере<span style="color: red;">(</span><span style="color: red;">)</span>
ТабДокумент <span style="color: red;">=</span> <span style="color: red;">Новый</span> ТабличныйДокумент<span style="color: red;">;</span>
ДанныеДерева <span style="color: red;">=</span> РеквизитФормыВЗначение<span style="color: red;">(</span><span style="color: black;">"Т"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ИсточникиДанных <span style="color: red;">=</span> <span style="color: red;">Новый</span> Структура<span style="color: red;">(</span><span style="color: black;">"ДанныеДерева"</span><span style="color: red;">,</span> ДанныеДерева<span style="color: red;">)</span><span style="color: red;">;</span>
СхемаКомпоновки <span style="color: red;">=</span> ПолучитьСхемуКомпоновкиПоДереву<span style="color: red;">(</span>ДанныеДерева<span style="color: red;">)</span><span style="color: red;">;</span>
КомпоновщикМакета <span style="color: red;">=</span> <span style="color: red;">Новый</span> КомпоновщикМакетаКомпоновкиДанных<span style="color: red;">;</span>
МакетКомпоновки <span style="color: red;">=</span> КомпоновщикМакета<span style="color: red;">.</span><span style="color: red;">Выполнить</span><span style="color: red;">(</span>СхемаКомпоновки<span style="color: red;">,</span> СхемаКомпоновки<span style="color: red;">.</span>НастройкиПоУмолчанию<span style="color: red;">)</span><span style="color: red;">;</span>
ПроцессорКомпоновки <span style="color: red;">=</span> <span style="color: red;">Новый</span> ПроцессорКомпоновкиДанных<span style="color: red;">;</span>
ПроцессорКомпоновки<span style="color: red;">.</span>Инициализировать<span style="color: red;">(</span>МакетКомпоновки<span style="color: red;">,</span> ИсточникиДанных<span style="color: red;">)</span><span style="color: red;">;</span>
ПроцессорВывода <span style="color: red;">=</span> <span style="color: red;">Новый</span> ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент<span style="color: red;">;</span>
ПроцессорВывода<span style="color: red;">.</span>УстановитьДокумент<span style="color: red;">(</span>ТабДокумент<span style="color: red;">)</span><span style="color: red;">;</span>
ПроцессорВывода<span style="color: red;">.</span>Вывести<span style="color: red;">(</span>ПроцессорКомпоновки<span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
<span style="color: brown;">&НаСервере</span>
<span style="color: red;">Функция</span> ПолучитьСхемуКомпоновкиПоДереву<span style="color: red;">(</span>ДанныеДерева<span style="color: red;">,</span> ВыбранныеПоляДерева <span style="color: red;">=</span> <span style="color: red;">Неопределено</span><span style="color: red;">,</span> ПолеИД <span style="color: red;">=</span> <span style="color: black;">"ИД"</span><span style="color: red;">,</span> ПолеРодительИД <span style="color: red;">=</span> <span style="color: black;">"РодительИД"</span><span style="color: red;">)</span>
<span style="color: red;">Если</span> ВыбранныеПоляДерева <span style="color: red;">=</span> <span style="color: red;">Неопределено</span> <span style="color: red;">Тогда</span>
ВыбранныеПоляДерева <span style="color: red;">=</span> <span style="color: red;">Новый</span> Массив<span style="color: red;">;</span>
<span style="color: red;">КонецЕсли</span><span style="color: red;">;</span>
ЗаполнитьВыбранныеПоляДерева <span style="color: red;">=</span> <span style="color: red;">НЕ</span> ВыбранныеПоляДерева<span style="color: red;">.</span>Количество<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
СхемаКомпоновки <span style="color: red;">=</span> <span style="color: red;">Новый</span> СхемаКомпоновкиДанных<span style="color: red;">;</span>
НастройкиКомпоновки <span style="color: red;">=</span> СхемаКомпоновки<span style="color: red;">.</span>НастройкиПоУмолчанию<span style="color: red;">;</span>
ИсточникДанных <span style="color: red;">=</span> СхемаКомпоновки<span style="color: red;">.</span>ИсточникиДанных<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
ИсточникДанных<span style="color: red;">.</span>Имя <span style="color: red;">=</span> <span style="color: black;">"ИсточникДанных"</span><span style="color: red;">;</span>
ИсточникДанных<span style="color: red;">.</span>ТипИсточникаДанных <span style="color: red;">=</span> <span style="color: black;">"Local"</span><span style="color: red;">;</span>
НаборДанных <span style="color: red;">=</span> СхемаКомпоновки<span style="color: red;">.</span>НаборыДанных<span style="color: red;">.</span>Добавить<span style="color: red;">(</span>Тип<span style="color: red;">(</span><span style="color: black;">"НаборДанныхОбъектСхемыКомпоновкиДанных"</span><span style="color: red;">)</span><span style="color: red;">)</span><span style="color: red;">;</span>
НаборДанных<span style="color: red;">.</span>ИмяОбъекта <span style="color: red;">=</span> <span style="color: black;">"ДанныеДерева"</span><span style="color: red;">;</span>
НаборДанных<span style="color: red;">.</span>Имя <span style="color: red;">=</span> <span style="color: black;">"НаборДанных"</span><span style="color: red;">;</span>
НаборДанных<span style="color: red;">.</span>ИсточникДанных <span style="color: red;">=</span> <span style="color: black;">"ИсточникДанных"</span><span style="color: red;">;</span>
<span style="color: red;">Для</span> <span style="color: red;">Каждого</span> КолонкаДерева <span style="color: red;">Из</span> ДанныеДерева<span style="color: red;">.</span>Колонки <span style="color: red;">Цикл</span>
ИмяПоля <span style="color: red;">=</span> КолонкаДерева<span style="color: red;">.</span>Имя<span style="color: red;">;</span>
ЗаголовокПоля <span style="color: red;">=</span> КолонкаДерева<span style="color: red;">.</span>Заголовок<span style="color: red;">;</span>
ПолеНабора <span style="color: red;">=</span> НаборДанных<span style="color: red;">.</span>Поля<span style="color: red;">.</span>Добавить<span style="color: red;">(</span>Тип<span style="color: red;">(</span><span style="color: black;">"ПолеНабораДанныхСхемыКомпоновкиДанных"</span><span style="color: red;">)</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПолеНабора<span style="color: red;">.</span>Заголовок <span style="color: red;">=</span> ЗаголовокПоля<span style="color: red;">;</span>
ПолеНабора<span style="color: red;">.</span>Поле <span style="color: red;">=</span> ИмяПоля<span style="color: red;">;</span>
<span style="color: red;">Если</span> ЗаполнитьВыбранныеПоляДерева <span style="color: red;">И</span> <span style="color: red;">НЕ</span> <span style="color: red;">(</span>ИмяПоля <span style="color: red;">=</span> ПолеИД <span style="color: red;">ИЛИ</span> ИмяПоля <span style="color: red;">=</span> ПолеРодительИД<span style="color: red;">)</span><span style="color: red;">Тогда</span>
ВыбранныеПоляДерева<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: red;">Новый</span> Структура<span style="color: red;">(</span><span style="color: black;">"Имя, Заголовок"</span><span style="color: red;">,</span> ИмяПоля<span style="color: red;">,</span> ЗаголовокПоля<span style="color: red;">)</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецЕсли</span><span style="color: red;">;</span>
<span style="color: red;">КонецЦикла</span><span style="color: red;">;</span>
СвязьНабора <span style="color: red;">=</span> СхемаКомпоновки<span style="color: red;">.</span>СвязиНаборовДанных<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
СвязьНабора<span style="color: red;">.</span>НаборДанныхИсточник <span style="color: red;">=</span> <span style="color: black;">"НаборДанных"</span><span style="color: red;">;</span>
СвязьНабора<span style="color: red;">.</span>НаборДанныхПриемник <span style="color: red;">=</span> <span style="color: black;">"НаборДанных"</span><span style="color: red;">;</span>
СвязьНабора<span style="color: red;">.</span>ВыражениеИсточник <span style="color: red;">=</span> ПолеИД<span style="color: red;">;</span>
СвязьНабора<span style="color: red;">.</span>ВыражениеПриемник <span style="color: red;">=</span> ПолеРодительИд<span style="color: red;">;</span>
СвязьНабора<span style="color: red;">.</span>НачальноеВыражение <span style="color: red;">=</span> <span style="color: black;">"0"</span><span style="color: red;">;</span>
ВыбранныеПоля <span style="color: red;">=</span> НастройкиКомпоновки<span style="color: red;">.</span>Выбор<span style="color: red;">.</span>Элементы<span style="color: red;">;</span>
<span style="color: red;">Для</span> <span style="color: red;">Каждого</span> ПолеДерева <span style="color: red;">Из</span> ВыбранныеПоляДерева <span style="color: red;">Цикл</span>
ПолеОтчет <span style="color: red;">=</span> ВыбранныеПоля<span style="color: red;">.</span>Добавить<span style="color: red;">(</span>Тип<span style="color: red;">(</span><span style="color: black;">"ВыбранноеПолеКомпоновкиДанных"</span><span style="color: red;">)</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПолеОтчет<span style="color: red;">.</span>Поле <span style="color: red;">=</span> <span style="color: red;">Новый</span> ПолеКомпоновкиДанных<span style="color: red;">(</span>ПолеДерева<span style="color: red;">.</span>Имя<span style="color: red;">)</span><span style="color: red;">;</span>
ПолеОтчет<span style="color: red;">.</span>Заголовок <span style="color: red;">=</span> ПолеДерева<span style="color: red;">.</span>Заголовок<span style="color: red;">;</span>
<span style="color: red;">КонецЦикла</span><span style="color: red;">;</span>
СтруктураГруппировки <span style="color: red;">=</span> НастройкиКомпоновки<span style="color: red;">.</span>Структура<span style="color: red;">;</span>
ЭлементГруппировки <span style="color: red;">=</span> СтруктураГруппировки<span style="color: red;">.</span>Добавить<span style="color: red;">(</span>Тип<span style="color: red;">(</span><span style="color: black;">"ГруппировкаКомпоновкиДанных"</span><span style="color: red;">)</span><span style="color: red;">)</span><span style="color: red;">;</span>
ЭлементГруппировки<span style="color: red;">.</span>Выбор<span style="color: red;">.</span>Элементы<span style="color: red;">.</span>Добавить<span style="color: red;">(</span>Тип<span style="color: red;">(</span><span style="color: black;">"АвтоВыбранноеПолеКомпоновкиДанных"</span><span style="color: red;">)</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">Возврат</span> СхемаКомпоновки<span style="color: red;">;</span>
<span style="color: red;">КонецФункции</span><span style="color: green;">// ПолучитьСхемуКомпоновкиПоДереву()</span>
<span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Процедура</span> СформироватьТабличныйДокумент<span style="color: red;">(</span>Команда<span style="color: red;">)</span>
СформироватьТабличныйДокументНаСервере<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span></code></pre>
Проверяем результат, заполняем дерево:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUHDimOQv1L0KaNkOXVnYBY_K54Y49GA5rzVthxn5Oo1r0PtHSJbFrReyrihoOqDXJkqsmiLbQuI191dLY4uZIHAm1y1a8XU-EGO3db9SHUT0c4g6Up71-drnDnZ7YysyXM4XhJZQYbTcl/s1600/000002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUHDimOQv1L0KaNkOXVnYBY_K54Y49GA5rzVthxn5Oo1r0PtHSJbFrReyrihoOqDXJkqsmiLbQuI191dLY4uZIHAm1y1a8XU-EGO3db9SHUT0c4g6Up71-drnDnZ7YysyXM4XhJZQYbTcl/s1600/000002.png" /></a></div>
<br />
Получаем табличный документ:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitGZ_Px_ojkUWjwgDiWFDql85Ouw-E6OBZQXEM5Y_FjAUw6bL4Ae3k4bmNrgC9vEm2BFJeIng5rhTQURKT6pzQ2SYZK-0EemK5x8dRHuk7-EqjyY0uzdzxMpxe9EXih_oD3bYNhSFPvnIw/s1600/000003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitGZ_Px_ojkUWjwgDiWFDql85Ouw-E6OBZQXEM5Y_FjAUw6bL4Ae3k4bmNrgC9vEm2BFJeIng5rhTQURKT6pzQ2SYZK-0EemK5x8dRHuk7-EqjyY0uzdzxMpxe9EXih_oD3bYNhSFPvnIw/s1600/000003.png" /></a></div>
<br />
<a href="https://drive.google.com/file/d/0B6vvASpBDRi-bXo2V3Npbzh3OGM/view?usp=sharing&resourcekey=0-rmqF3HHQ8eBT_r9loqKfIQ" target="_blank">Сама обработка</a>, включает макет схемы компоновки для демонстрации настроек.<br />
<br /></div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com8tag:blogger.com,1999:blog-7763816944206062403.post-86664245314030218542017-01-31T22:08:00.001+03:002021-09-29T19:03:34.948+03:00Произвольная иерархия в СКД<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKRN9tMh_YIr9czTBuXoiy6M2JC-xgq-UR55OxClScYMlN_lB8EXz2jzqtnm4cbAVPBkkNZ1TAs-upn1J67H0cfAh56LH4OvXerCpp6ZSeowR5-7cfjfmvMIzABPlopk4K6R91yZNWiJNm/s1600/40670856.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKRN9tMh_YIr9czTBuXoiy6M2JC-xgq-UR55OxClScYMlN_lB8EXz2jzqtnm4cbAVPBkkNZ1TAs-upn1J67H0cfAh56LH4OvXerCpp6ZSeowR5-7cfjfmvMIzABPlopk4K6R91yZNWiJNm/s1600/40670856.png" /></a></div>
Относительно недавно попал на доработку отчет, содержащий приличное количество кода, который в итоге был выброшен полностью, поскольку возможностей системы компоновки данных вполне хватило для получения необходимого результата. Большая часть этого кода как раз отвечала за построение иерархической структуры. К сожалению, этому разработчику продемонстрировать возможности СКД возможности нет. Но поделиться со всеми остальными коллегами, интересующимися данной темой, это всегда пожалуйста :)<br />
<br />
В СКД можно реализовать следующие варианты построения иерархии:<br />
- к основному набору данных достраивается иерархическая структура;<br />
- рекурсивное построение иерархии по одному набору данных.<br />
В этом посте я хочу рассмотреть второй вариант на примере ресурсных спецификаций в демо-базе 1С:ERP 2.<br />
<a name='more'></a><div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i9.ytimg.com/vi/ZCfE2a7DpU8/default.jpg?sqp=CPSew8QF&rs=AOn4CLBkI15iJgqr8KyYXOSUEF2Peyv0zQ" frameborder="0" height="480" src="https://www.youtube.com/embed/ZCfE2a7DpU8?feature=player_embedded" width="640"></iframe></div>
<br />
Начнем с простого, получим иерархию детальных записей. Создадим в схеме компоновки набор данных с запросом:<br />
<br />
<pre style="color: blue;"><code class="_1c8">ВЫБРАТЬ
Т<span style="color: red;">.</span>Ссылка КАК СпецификацияРодитель<span style="color: red;">,</span>
Т<span style="color: red;">.</span>ПроизводитсяВПроцессе<span style="color: red;">,</span>
Т<span style="color: red;">.</span>ИсточникПолученияПолуфабриката КАК Спецификация<span style="color: red;">,</span>
Т<span style="color: red;">.</span>Номенклатура<span style="color: red;">,</span>
Т<span style="color: red;">.</span>Количество
<span style="color: red;">ИЗ</span>
Справочник<span style="color: red;">.</span>РесурсныеСпецификации<span style="color: red;">.</span>МатериалыИУслуги КАК Т
ГДЕ
Т<span style="color: red;">.</span>Ссылка В<span style="color: red;">(</span><span style="color: brown;">&СписокСпецификаций)</span></code></pre>
<br />
Настроим связь набора:<br />
- Спецификация >> СпецификацияРодитель;<br />
- параметр связи СписокСпецификаций, как список параметров;<br />
- условие связи ПроизводитсяВПроцессе<br />
- начальное значение связи - параметр Спецификация, необходимо будет добавить на вкладке "Параметры".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVYxZR9d7f0MvjOEnwz-1mW4EmYdcv0BQGj2IOKM7GOXpwZ-TKc-TLmQQm7Xxy67l3jFpeBuH9PU9RbauLPmtl1cku42iiBcCAKwiVIHlv8U1DG1Q88l5cLRXdSt8U-SDFmyZxWgllqdse/s1600/00001.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="47" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVYxZR9d7f0MvjOEnwz-1mW4EmYdcv0BQGj2IOKM7GOXpwZ-TKc-TLmQQm7Xxy67l3jFpeBuH9PU9RbauLPmtl1cku42iiBcCAKwiVIHlv8U1DG1Q88l5cLRXdSt8U-SDFmyZxWgllqdse/s640/00001.png" width="640" /></a></div>
<br />
Производим настройки схемы компоновки, добавляем группировку детальных записей.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEim4NP4CXeiFivSvo5N7g6FWBD9i1A1hEmR4CyczV9RhY2b2xRpPwYCubfLCvhALvvnCwOHQuaFT6LK7Y15HAyBlOdt6FMCTPcgJ1PFbZrS405bNOnCmUrhSB5tFI34R_W6GdsiRSvw12oO/s1600/00002.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEim4NP4CXeiFivSvo5N7g6FWBD9i1A1hEmR4CyczV9RhY2b2xRpPwYCubfLCvhALvvnCwOHQuaFT6LK7Y15HAyBlOdt6FMCTPcgJ1PFbZrS405bNOnCmUrhSB5tFI34R_W6GdsiRSvw12oO/s1600/00002.png" /></a></div>
<br />
Проверяем результат:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_hNt-_MBVr-PJJbvp_kwM_aEOTIMBqBJWf_7MquwByUcCpf01c2otvYvhfM9acwAGxhUexJhaEO274Z9L_JSzDnaVAkEoneEl2PktnPtDiFvoWSzEdyveiRUapHi4kH-oeYcXZwfxfXbR/s1600/00003.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="410" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_hNt-_MBVr-PJJbvp_kwM_aEOTIMBqBJWf_7MquwByUcCpf01c2otvYvhfM9acwAGxhUexJhaEO274Z9L_JSzDnaVAkEoneEl2PktnPtDiFvoWSzEdyveiRUapHi4kH-oeYcXZwfxfXbR/s640/00003.png" width="640" /></a></div>
<br />
Для начала неплохо, теперь сделаем так, чтобы в качестве корневого элемента выступала выбранная спецификация. Переделаем запрос, добавим данные начальной спецификации:<br />
<br />
<pre style="color: blue;"><code class="_1c8">ВЫБРАТЬ
Т<span style="color: red;">.</span>Ссылка КАК СпецификацияРодитель<span style="color: red;">,</span>
Т<span style="color: red;">.</span>ПроизводитсяВПроцессе<span style="color: red;">,</span>
Т<span style="color: red;">.</span>ИсточникПолученияПолуфабриката КАК Спецификация<span style="color: red;">,</span>
Т<span style="color: red;">.</span>Номенклатура<span style="color: red;">,</span>
Т<span style="color: red;">.</span>Количество
<span style="color: red;">ИЗ</span>
Справочник<span style="color: red;">.</span>РесурсныеСпецификации<span style="color: red;">.</span>МатериалыИУслуги КАК Т
ГДЕ
Т<span style="color: red;">.</span>Ссылка В<span style="color: red;">(</span><span style="color: brown;">&СписокСпецификаций)</span>
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ЗНАЧЕНИЕ<span style="color: red;">(</span>Справочник<span style="color: red;">.</span>РесурсныеСпецификации<span style="color: red;">.</span>ПустаяСсылка<span style="color: red;">)</span><span style="color: red;">,</span>
<span style="color: red;">ИСТИНА</span><span style="color: red;">,</span>
<span style="color: brown;">&Спецификация,</span>
<span style="color: brown;">&Спецификация,</span>
<span style="color: black;">1</span></code></pre>
<br />
Так же переделаем настройки связей, в качестве начального значения связей теперь выступает ЗНАЧЕНИЕ(Справочник.РесурсныеСпецификации.ПустаяСсылка).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdA8VTuoCkmf9wgaJSAwzGz1EI4mB9IhjfYbvribR9833xrYZOF9uDJS5sXSMS1R0ZwS4-8caAy2T7TLlyQU6JJ19xW9o5N2roy2sZZnEJhyphenhyphenoMw8d2rhgNRZjn4ttC4nlbGA4zLvRdNZVO/s1600/00004.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="50" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdA8VTuoCkmf9wgaJSAwzGz1EI4mB9IhjfYbvribR9833xrYZOF9uDJS5sXSMS1R0ZwS4-8caAy2T7TLlyQU6JJ19xW9o5N2roy2sZZnEJhyphenhyphenoMw8d2rhgNRZjn4ttC4nlbGA4zLvRdNZVO/s640/00004.png" width="640" /></a></div>
<br />
Уже лучше:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIWCDEONHyWsMCqdd63BxPJNE2Dm9H9D3ry4lKRMvtY2x_DNMS2Dd1kdtBw3kPoQtzbKKNR9lpZuxl5fZU4M8mbUWR_FiwbIWe-IDK0gulVstKPWT9haIUOWdrqAsoqNjV39GQyk0_DdhV/s1600/00005.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="287" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIWCDEONHyWsMCqdd63BxPJNE2Dm9H9D3ry4lKRMvtY2x_DNMS2Dd1kdtBw3kPoQtzbKKNR9lpZuxl5fZU4M8mbUWR_FiwbIWe-IDK0gulVstKPWT9haIUOWdrqAsoqNjV39GQyk0_DdhV/s640/00005.png" width="640" /></a></div>
<br />
Теперь сделаем так, чтобы можно было получить в отчете реальное количество материалов. Для этого необходимо ввести второй параметр связи КоличествоСпецификации, через который будет передаваться количество верхнего уровня.<br />
<br />
<pre style="color: blue;"><code class="_1c8">ВЫБРАТЬ
Т<span style="color: red;">.</span>Ссылка КАК СпецификацияРодитель<span style="color: red;">,</span>
Т<span style="color: red;">.</span>ПроизводитсяВПроцессе<span style="color: red;">,</span>
Т<span style="color: red;">.</span>ИсточникПолученияПолуфабриката КАК Спецификация<span style="color: red;">,</span>
Т<span style="color: red;">.</span>Номенклатура<span style="color: red;">,</span>
Т<span style="color: red;">.</span>Количество <span style="color: red;">*</span> <span style="color: brown;">&КоличествоСпецификации</span> КАК Количество<span style="color: red;">,</span>
Т<span style="color: red;">.</span>Количество КАК КоличествоНормативное<span style="color: red;">,</span>
<span style="color: brown;">&КоличествоСпецификации</span> КАК КоличествоСпецификации
<span style="color: red;">ИЗ</span>
Справочник<span style="color: red;">.</span>РесурсныеСпецификации<span style="color: red;">.</span>МатериалыИУслуги КАК Т
ГДЕ
Т<span style="color: red;">.</span>Ссылка В <span style="color: red;">(</span><span style="color: brown;">&СписокСпецификаций)</span>
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ЗНАЧЕНИЕ<span style="color: red;">(</span>Справочник<span style="color: red;">.</span>РесурсныеСпецификации<span style="color: red;">.</span>ПустаяСсылка<span style="color: red;">)</span><span style="color: red;">,</span>
<span style="color: red;">ИСТИНА</span><span style="color: red;">,</span>
<span style="color: brown;">&Спецификация,</span>
<span style="color: brown;">&Спецификация,</span>
<span style="color: black;">1</span><span style="color: red;">,</span>
<span style="color: black;">1</span><span style="color: red;">,</span>
<span style="color: black;">1</span></code></pre>
Настроим связи наборов, добавим еще одну строку:<br />
- Количество >> КоличествоСпецификации;<br />
- начальное значение 1.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivRUp-MXBnwM528DTqv2SI2w-omjA0Wvz7sfjMlrabGXR0RXykc21JdvDcpfXt0mwkKL0T3a5hHTWwfck2Bs3uj-5L8UUIEOTeQ7AMARwP5gvW9qSeu2y0m0bpcdW7iwaYMpazm_fkjkco/s1600/00006.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="65" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivRUp-MXBnwM528DTqv2SI2w-omjA0Wvz7sfjMlrabGXR0RXykc21JdvDcpfXt0mwkKL0T3a5hHTWwfck2Bs3uj-5L8UUIEOTeQ7AMARwP5gvW9qSeu2y0m0bpcdW7iwaYMpazm_fkjkco/s640/00006.png" width="640" /></a></div>
<br />
Проверяем результат, получилось то, что надо и без единой строчки кода.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfWrZsGjexBn_0nMxQP59wBSA11qmp_hLFfh9L7GfLskVKNS60k-H6Uff4t5SdPc4ZhdmEU-a0tRrqSdWubnWh7EqHScVjknL-uYCCYr3rnfQ-BWHw73iEs_qE4f4zYgS7pyP44VJNzNLK/s1600/00007.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="268" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfWrZsGjexBn_0nMxQP59wBSA11qmp_hLFfh9L7GfLskVKNS60k-H6Uff4t5SdPc4ZhdmEU-a0tRrqSdWubnWh7EqHScVjknL-uYCCYr3rnfQ-BWHw73iEs_qE4f4zYgS7pyP44VJNzNLK/s640/00007.png" width="640" /></a></div>
<br />
Теперь добавим вариант настроек для получения списка используемых материалов. Здесь особенность в том, что отбор используется для группировки "Номенклатура", а не для отчета в целом.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6d2y5on5du3y-H1wwj-eXND7JLKPKFcdMxecpDdhtwH5aR3UxAol94PXVvt4Nhid-mAkeeRCZFIcxCRmBo8cSLTbZKMQszr5gzpwsDg_120dn_N7mSQJsID_GJkd5KGq-wE9V8ClfQS8H/s1600/00008.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6d2y5on5du3y-H1wwj-eXND7JLKPKFcdMxecpDdhtwH5aR3UxAol94PXVvt4Nhid-mAkeeRCZFIcxCRmBo8cSLTbZKMQszr5gzpwsDg_120dn_N7mSQJsID_GJkd5KGq-wE9V8ClfQS8H/s1600/00008.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpv8IjxctmuCWf_yt6gNKggX0FnduiLTzuUqlVS726-Q_j9Y8F5GM5BaLsB6e1IoIj58erv79h1X5kjdWchuw5AQ9yrsTq84W3L0FeCpvlz7RfRaNBesNMk7J8LK19Lj2Hs80xo3C-PPYy/s1600/00009.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpv8IjxctmuCWf_yt6gNKggX0FnduiLTzuUqlVS726-Q_j9Y8F5GM5BaLsB6e1IoIj58erv79h1X5kjdWchuw5AQ9yrsTq84W3L0FeCpvlz7RfRaNBesNMk7J8LK19Lj2Hs80xo3C-PPYy/s1600/00009.png" /></a></div>
<br />
Ну и напоследок продемонстрирую отчет о входимости спецификации.<br />
<br />
<pre style="color: blue;"><code class="_1c8">ВЫБРАТЬ
Т<span style="color: red;">.</span>ИсточникПолученияПолуфабриката КАК СпецификацияПриемник<span style="color: red;">,</span>
Т<span style="color: red;">.</span>Ссылка КАК Спецификация
<span style="color: red;">ИЗ</span>
Справочник<span style="color: red;">.</span>РесурсныеСпецификации<span style="color: red;">.</span>МатериалыИУслуги КАК Т
ГДЕ
Т<span style="color: red;">.</span>ПроизводитсяВПроцессе
<span style="color: red;">И</span> Т<span style="color: red;">.</span>ИсточникПолученияПолуфабриката В<span style="color: red;">(</span><span style="color: brown;">&СписокСпецификаций)</span>
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ЗНАЧЕНИЕ<span style="color: red;">(</span>Справочник<span style="color: red;">.</span>РесурсныеСпецификации<span style="color: red;">.</span>ПустаяСсылка<span style="color: red;">)</span><span style="color: red;">,</span>
<span style="color: brown;">&Спецификация</span> </code></pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIzoLR1RkgaKVEib7ZjyDfpI2placgq-54H4Cw5q8y-rTRdI80DS1qSGynP0xh9ju8vzHsEWBHIiXAofzwzUyQ8wKIbLmAhxOowmHqDpcdY9-ZRi3Yr3lLVk3eIGqCrHNVtqk2t3Z3kqnx/s1600/00010.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="58" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIzoLR1RkgaKVEib7ZjyDfpI2placgq-54H4Cw5q8y-rTRdI80DS1qSGynP0xh9ju8vzHsEWBHIiXAofzwzUyQ8wKIbLmAhxOowmHqDpcdY9-ZRi3Yr3lLVk3eIGqCrHNVtqk2t3Z3kqnx/s640/00010.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxM6PG7eSUbG-p6_V6bJcKCUoFDUk4kGF6CEHpmfVGH5ySrHFvZqNPYApTqD6Gs6nLS_z5uhkuunv0OeqP2bQOiEocbgutg5GAgh1Hxk8oSsiRy25hphD-ATPjs1KXQDFBPk7U2S5yLUIt/s1600/00011.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="273" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxM6PG7eSUbG-p6_V6bJcKCUoFDUk4kGF6CEHpmfVGH5ySrHFvZqNPYApTqD6Gs6nLS_z5uhkuunv0OeqP2bQOiEocbgutg5GAgh1Hxk8oSsiRy25hphD-ATPjs1KXQDFBPk7U2S5yLUIt/s640/00011.png" width="640" /></a></div>
<br />
Стоит учесть, что с точки зрения производительности данного запроса структура метаданных конфигурации не является оптимальной, поскольку в типовой конфигурации поле ИсточникПолученияПолуфабриката таблицы МатериалыИУслуги не имеет индекса. В следствии чего операции чтения будут приводить к сканированию данных.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUoS8a6nib1aW2677Y6rqTihm5srQEq0BuGwocwYxkF_ghuYQU4RbRcsesjqjhFWm-W0o9mFh-FAJXrZZprprwGkz4Q_q6pcwvkxpKZBenhZPmeL1KI_ObntfbLmkg0OdnumaElI25VWMl/s1600/00012.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUoS8a6nib1aW2677Y6rqTihm5srQEq0BuGwocwYxkF_ghuYQU4RbRcsesjqjhFWm-W0o9mFh-FAJXrZZprprwGkz4Q_q6pcwvkxpKZBenhZPmeL1KI_ObntfbLmkg0OdnumaElI25VWMl/s1600/00012.png" /></a></div>
<br />
Варианты решения:<br />
- добавить индексацию для поля ИсточникПолученияПолуфабриката и отслеживать это изменение при обновлении;<br />
- добавить свой критерий отбора, что так же приведет к созданию необходимого индекса.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBe6olhGZJ4HTNl7GJAXiXZ2v4rFXQ6UvjgHH7sVgGc-Bs9_QaHP1WH2D-zyaRwRnNUA7pqfvwfGVF7tU_OBI8W8V_vw8nwKpQ-Re7BHCTCmTd7qOusf8kK6Qzk-oWup8m48R7d2SKUk4w/s1600/00013.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBe6olhGZJ4HTNl7GJAXiXZ2v4rFXQ6UvjgHH7sVgGc-Bs9_QaHP1WH2D-zyaRwRnNUA7pqfvwfGVF7tU_OBI8W8V_vw8nwKpQ-Re7BHCTCmTd7qOusf8kK6Qzk-oWup8m48R7d2SKUk4w/s1600/00013.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj85W4zL20-Dc9lK-BhhX5S0RJS3jMztHyiCu8EnxqGrzlU9pUf5hLam2v3R7LxC-TGXL1-bga9IXmPhIiYsl2Z5lOM_GixxctpEg9XwFpd9yitOBA-rawD0mgEOC4PNLSqcA5crOkahID_/s1600/00014.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj85W4zL20-Dc9lK-BhhX5S0RJS3jMztHyiCu8EnxqGrzlU9pUf5hLam2v3R7LxC-TGXL1-bga9IXmPhIiYsl2Z5lOM_GixxctpEg9XwFpd9yitOBA-rawD0mgEOC4PNLSqcA5crOkahID_/s1600/00014.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLJkXkMiwFZo-Q_azmNStyXPZcluroo4AACkNsffyCe72YdyhqymZbTwJ-H6-vmcnHEfq1QFMIq6rl48SlCtGPOwIXu4fM1uF2qIBFec9qfbksEi5mshNyBKup1Bj1Xx4S1oa-icqgh7VJ/s1600/00015.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLJkXkMiwFZo-Q_azmNStyXPZcluroo4AACkNsffyCe72YdyhqymZbTwJ-H6-vmcnHEfq1QFMIq6rl48SlCtGPOwIXu4fM1uF2qIBFec9qfbksEi5mshNyBKup1Bj1Xx4S1oa-icqgh7VJ/s1600/00015.png" /></a></div>
<br />
<a href="https://drive.google.com/file/d/0B6vvASpBDRi-ZnRmQkdZQXRENTA/view?usp=sharing&resourcekey=0-uFWpNN9X5X-GZwx2QiVdOw" target="_blank">Скачать пример отчета</a><br />
<br />
<br />
<br /></div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com15tag:blogger.com,1999:blog-7763816944206062403.post-5600066298023043812016-11-06T00:26:00.000+03:002016-11-06T00:26:08.094+03:00Автоматизированное тестирование: обмен данными между клиентом и менеджером<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg32MwdIhGIq1f-vpK1pZFrmRXXCepoco2U3mT1vrNaOOu20ldZpRtv6RkYT7wU7vC4FeW9mpf7sGUraIzHOUMMNwe8TEZldwobDMpmbjGBbjy_ajT9pDSALn-9ajHcIc0li3dblnolEGlI/s1600/d17a3dba19742726dfe2d7515f09a880.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg32MwdIhGIq1f-vpK1pZFrmRXXCepoco2U3mT1vrNaOOu20ldZpRtv6RkYT7wU7vC4FeW9mpf7sGUraIzHOUMMNwe8TEZldwobDMpmbjGBbjy_ajT9pDSALn-9ajHcIc0li3dblnolEGlI/s400/d17a3dba19742726dfe2d7515f09a880.png" /></a><br />
Разрабатывая сценарный тест с использованием механизма <a href="http://v8.1c.ru/overview/Term_000000816.htm" target="_blank">автоматизированного тестирования</a>, столкнулся с необходимостью передачи произвольных данных, генерируемых на клиенте тестирования, на сторону менеджера для использования в качестве входных данных в последующих шагах сценария. В моем случае на одном этапе выполнения теста создавался пакет документов и генерировались штрихкоды на товары. На следующем этапе было необходимо запустить обработку для работы с ТСД и выполнить считывание этих штрихкодов.<br />
<br />
<a name='more'></a><br />
После анализа возможных способов реализации было решено остановиться на использовании механизма хранилищ настроек. Плюсы данного подхода:<br />
- чтение/запись осуществляется одной строкой кода;<br />
- механизм позволяет организовать сложное хранение значений по сочетанию КлючОбъекта/КлючНастроек/ИмяПользователя.<br />
<div>
Далее оказалось, что программным способом режим запуска приложения, как клиента тестирования, на данный момент определить нельзя.</div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtpU0ILwlUr8RhOFNu5qbhmVEQ317d2QfwP022gqTyzzFXM2nGK2cQ5SEtr2bnVByGIVPWJtBkLLzpGTshf5iQ6rL4pXVN3Am8Q3O-9Cbh6p30KMVNUxDgU3wPaDn4_6NNG8OhnvKkf-lO/s1600/%25D0%2591%25D0%25B5%25D0%25B7%25D1%258B%25D0%25BC%25D1%258F%25D0%25BD%25D0%25BD%25D1%258B%25D0%25B92.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtpU0ILwlUr8RhOFNu5qbhmVEQ317d2QfwP022gqTyzzFXM2nGK2cQ5SEtr2bnVByGIVPWJtBkLLzpGTshf5iQ6rL4pXVN3Am8Q3O-9Cbh6p30KMVNUxDgU3wPaDn4_6NNG8OhnvKkf-lO/s1600/%25D0%2591%25D0%25B5%25D0%25B7%25D1%258B%25D0%25BC%25D1%258F%25D0%25BD%25D0%25BD%25D1%258B%25D0%25B92.png" /></a><br />
Данная проблема решилась путем дополнения строки запуска клиента тестирования пользовательским параметром "/C КлиентТестирования".<br />
<br />
Теперь в необходимых участках кода можно реализовать сохранение произвольных данных. Например, разрабатывая демонстрационный сценарий, в <a href="http://start1c.blogspot.ru/2014/01/21-complete.html" target="_blank">тестовой базе</a> в модуле формы документа ПоступлениеТоваровУслуг я добавил проверку значения параметра перед записью:<br />
<br />
<pre style="color: blue;"><code class="_1c8"><span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Процедура</span> ПередЗаписью<span style="color: red;">(</span>Отказ<span style="color: red;">,</span> ПараметрыЗаписи<span style="color: red;">)</span>
ПараметрыЗаписи<span style="color: red;">.</span>Вставить<span style="color: red;">(</span><span style="color: black;">"ЭтоКлиентТестирования"</span><span style="color: red;">,</span> ПараметрЗапуска <span style="color: red;">=</span> <span style="color: black;">"КлиентТестирования"</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
<span style="color: brown;">&НаСервере</span>
<span style="color: red;">Процедура</span> ПриЗаписиНаСервере<span style="color: red;">(</span>Отказ<span style="color: red;">,</span> ТекущийОбъект<span style="color: red;">,</span> ПараметрыЗаписи<span style="color: red;">)</span>
<span style="color: red;">Если</span> ПараметрыЗаписи<span style="color: red;">.</span>ЭтоКлиентТестирования <span style="color: red;">Тогда</span>
СохранитьРезультатТестирования<span style="color: red;">(</span>ТекущийОбъект<span style="color: red;">.</span>Ссылка<span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецЕсли</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
<span style="color: brown;">&НаСервереБезКонтекста</span>
<span style="color: red;">Процедура</span> СохранитьРезультатТестирования<span style="color: red;">(</span>РезультатТестирования<span style="color: red;">)</span>
ХранилищеОбщихНастроек<span style="color: red;">.</span>Сохранить<span style="color: red;">(</span><span style="color: black;">"ТестовоеПриложение_ДанныеОбмена"</span><span style="color: red;">,</span> <span style="color: black;">"ПоступлениеТоваровУслуг_Запись"</span><span style="color: red;">,</span> РезультатТестирования<span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
</code></pre>
<br />
Перейдем к реализации сценария с получением данных.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd3eCRwXy14ikiQF3r1c25ZW96CKl3Vn0XJmkcHCvJ7o331PCAa85UL9Mh20NHmgYgxFKntHXADsOzg1PC6VKZOirBaJoCHppx9O5A-IBrEb-4sp5zojZrbHaCPShVgUlhGH4sT_pv79dw/s1600/%25D0%2591%25D0%25B5%25D0%25B7%25D1%258B%25D0%25BC%25D1%258F%25D0%25BD%25D0%25BD%25D1%258B%25D0%25B92.png" imageanchor="1"><img border="0" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd3eCRwXy14ikiQF3r1c25ZW96CKl3Vn0XJmkcHCvJ7o331PCAa85UL9Mh20NHmgYgxFKntHXADsOzg1PC6VKZOirBaJoCHppx9O5A-IBrEb-4sp5zojZrbHaCPShVgUlhGH4sT_pv79dw/s320/%25D0%2591%25D0%25B5%25D0%25B7%25D1%258B%25D0%25BC%25D1%258F%25D0%25BD%25D0%25BD%25D1%258B%25D0%25B92.png" width="320" /></a><br />
<br />
В форме ИнициализацияТеста происходит запуск клиента тестирования и определяется порядок запуска тестов.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJXMRDFIRt14cSH3FA-3P6migRbx7eg2nyLUolyZtYe8RGbGptQvOzLPbinLYxS7meNBQ-8Yw41IzTJsI0KiM0ww_erFUO4Lo2geTaN8f2EPu7jV5jhKzXKB6WiY_UzaL_feVsqdfzKFwz/s1600/%25D0%2591%25D0%25B5%25D0%25B7%25D1%258B%25D0%25BC%25D1%258F%25D0%25BD%25D0%25BD%25D1%258B%25D0%25B92.png" imageanchor="1"><img border="0" height="187" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJXMRDFIRt14cSH3FA-3P6migRbx7eg2nyLUolyZtYe8RGbGptQvOzLPbinLYxS7meNBQ-8Yw41IzTJsI0KiM0ww_erFUO4Lo2geTaN8f2EPu7jV5jhKzXKB6WiY_UzaL_feVsqdfzKFwz/s320/%25D0%2591%25D0%25B5%25D0%25B7%25D1%258B%25D0%25BC%25D1%258F%25D0%25BD%25D0%25BD%25D1%258B%25D0%25B92.png" width="320" /></a><br />
<br />
<pre style="color: blue;"><code class="_1c8"><span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Перем</span> КонтекстВыполнения<span style="color: red;">;</span>
<span style="color: brown;">#Область ИнициализацияТестовогоПриложения</span>
<span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Процедура</span> ТестДолжен_ИнициализироватьТестовоеПриложение<span style="color: red;">(</span><span style="color: red;">)</span> <span style="color: red;">Экспорт</span>
КонтекстВыполнения <span style="color: red;">=</span> <span style="color: red;">Новый</span> Структура<span style="color: red;">;</span>
ИмяПользователя <span style="color: red;">=</span> <span style="color: black;">"Админ"</span><span style="color: red;">;</span>
Пароль <span style="color: red;">=</span> <span style="color: black;">""</span><span style="color: red;">;</span>
Порт <span style="color: red;">=</span> <span style="color: black;">1539</span><span style="color: red;">;</span>
ТаймаутОжиданияПриложенияВСекундах <span style="color: red;">=</span> <span style="color: black;">20</span><span style="color: red;">;</span>
СтрокаЗапуска <span style="color: red;">=</span> ПолучитьСтрокуЗапуска<span style="color: red;">(</span>ИмяПользователя<span style="color: red;">,</span> Пароль<span style="color: red;">,</span> Порт<span style="color: red;">)</span><span style="color: red;">;</span>
ЗапуститьПриложение<span style="color: red;">(</span>СтрокаЗапуска<span style="color: red;">)</span><span style="color: red;">;</span>
ТестовоеПриложение <span style="color: red;">=</span> <span style="color: red;">Новый</span> ТестируемоеПриложение<span style="color: red;">(</span><span style="color: red;">,</span> Порт<span style="color: red;">)</span><span style="color: red;">;</span>
ВремяОкончанияОжидания <span style="color: red;">=</span> ТекущаяДата<span style="color: red;">(</span><span style="color: red;">)</span> <span style="color: red;">+</span> ТаймаутОжиданияПриложенияВСекундах<span style="color: red;">;</span>
Подключен <span style="color: red;">=</span> <span style="color: red;">Ложь</span><span style="color: red;">;</span>
ОписаниеОшибкиСоединения <span style="color: red;">=</span> <span style="color: black;">""</span><span style="color: red;">;</span>
<span style="color: red;">Пока</span> <span style="color: red;">Не</span> ТекущаяДата<span style="color: red;">(</span><span style="color: red;">)</span> <span style="color: red;">></span><span style="color: red;">=</span> ВремяОкончанияОжидания <span style="color: red;">Цикл</span>
<span style="color: red;">Попытка</span>
ТестовоеПриложение<span style="color: red;">.</span>УстановитьСоединение<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
Подключен <span style="color: red;">=</span> <span style="color: red;">Истина</span><span style="color: red;">;</span>
<span style="color: red;">Прервать</span><span style="color: red;">;</span>
<span style="color: red;">Исключение</span>
ОписаниеОшибкиСоединения <span style="color: red;">=</span> ОписаниеОшибки<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПопытки</span><span style="color: red;">;</span>
<span style="color: red;">КонецЦикла</span><span style="color: red;">;</span>
<span style="color: red;">Если</span> <span style="color: red;">Не</span> Подключен <span style="color: red;">Тогда</span>
ТестовоеПриложение <span style="color: red;">=</span> <span style="color: red;">Неопределено</span><span style="color: red;">;</span>
<span style="color: red;">ВызватьИсключение</span> <span style="color: black;">"Не смогли установить соединение! "</span> <span style="color: red;">+</span> Символы<span style="color: red;">.</span>ПС <span style="color: red;">+</span> ОписаниеОшибкиСоединения<span style="color: red;">;</span>
<span style="color: red;">КонецЕсли</span><span style="color: red;">;</span>
КонтекстВыполнения<span style="color: red;">.</span>Вставить<span style="color: red;">(</span><span style="color: black;">"ТестовоеПриложение"</span><span style="color: red;">,</span> ТестовоеПриложение<span style="color: red;">)</span><span style="color: red;">;</span>
КонтекстВыполнения<span style="color: red;">.</span>Вставить<span style="color: red;">(</span><span style="color: black;">"ИмяПользователя"</span><span style="color: red;">,</span> ИмяПользователя<span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
<span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Функция</span> ПолучитьСтрокуЗапуска<span style="color: red;">(</span>ИмяПользователя <span style="color: red;">=</span> <span style="color: black;">""</span><span style="color: red;">,</span> Пароль <span style="color: red;">=</span> <span style="color: black;">""</span><span style="color: red;">,</span> Порт <span style="color: red;">=</span> <span style="color: black;">""</span><span style="color: red;">)</span>
Результат <span style="color: red;">=</span> КаталогПрограммы<span style="color: red;">(</span><span style="color: red;">)</span> <span style="color: red;">+</span> <span style="color: black;">"1cv8c.exe ENTERPRISE "</span> <span style="color: red;">+</span>
<span style="color: black;">"/IBConnectionString"""</span> <span style="color: red;">+</span> СтрЗаменить<span style="color: red;">(</span>СтрокаСоединенияИнформационнойБазы<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">,</span> <span style="color: black;">""""</span><span style="color: red;">,</span> <span style="color: black;">""""""</span><span style="color: red;">)</span> <span style="color: red;">+</span> <span style="color: black;">""""</span> <span style="color: red;">+</span>
<span style="color: black;">"/N"""</span> <span style="color: red;">+</span> ИмяПользователя <span style="color: red;">+</span> <span style="color: black;">""""</span> <span style="color: red;">+</span> <span style="color: black;">"/P"""</span> <span style="color: red;">+</span> Пароль <span style="color: red;">+</span> <span style="color: black;">""""</span> <span style="color: red;">+</span>
<span style="color: black;">" /TESTCLIENT -TPort"</span> <span style="color: red;">+</span> XMLСтрока<span style="color: red;">(</span>Порт<span style="color: red;">)</span> <span style="color: red;">+</span>
<span style="color: black;">" /C КлиентТестирования"</span><span style="color: red;">;</span>
<span style="color: red;">Возврат</span> Результат<span style="color: red;">;</span>
<span style="color: red;">КонецФункции</span>
<span style="color: brown;">#КонецОбласти</span>
<span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Процедура</span> ТестДолжен_СоздатьПоступлениеТоваровУслуг<span style="color: red;">(</span><span style="color: red;">)</span> <span style="color: red;">Экспорт</span>
<span style="color: red;">Если</span> КонтекстВыполнения <span style="color: red;">=</span> <span style="color: red;">Неопределено</span> <span style="color: red;">Тогда</span>
ТестДолжен_ИнициализироватьТестовоеПриложение<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецЕсли</span><span style="color: red;">;</span>
КонтекстТеста <span style="color: red;">=</span> ПолучитьФорму<span style="color: red;">(</span><span style="color: black;">"ВнешняяОбработка.МодульныйТест.Форма.ТестДолжен_СоздатьПоступлениеТоваровУслуг"</span><span style="color: red;">)</span><span style="color: red;">;</span>
КонтекстТеста<span style="color: red;">.</span>ВыполнитьТест<span style="color: red;">(</span>КонтекстВыполнения<span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
<span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Процедура</span> ВыполнитьТест<span style="color: red;">(</span>Команда<span style="color: red;">)</span>
ТестДолжен_ИнициализироватьТестовоеПриложение<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
ТестДолжен_СоздатьПоступлениеТоваровУслуг<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
</code></pre>
<br />
Форма ТестДолжен_СоздатьПоступлениеТоваровУслуг содержит сам код теста. Код вынесен в отдельную форму по личным соображениям.<br />
<br />
<pre style="color: blue;"><code class="_1c8"><span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Процедура</span> ВыполнитьТест<span style="color: red;">(</span>КонтекстВыполнения<span style="color: red;">)</span> <span style="color: red;">Экспорт</span>
<span style="color: red;">Перем</span> ТестовоеПриложение<span style="color: red;">;</span>
КонтекстВыполнения<span style="color: red;">.</span>Свойство<span style="color: red;">(</span><span style="color: black;">"ТестовоеПриложение"</span><span style="color: red;">,</span> ТестовоеПриложение<span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">Если</span> ТестовоеПриложение <span style="color: red;">=</span> <span style="color: red;">Неопределено</span> <span style="color: red;">Тогда</span>
<span style="color: red;">ВызватьИсключение</span> <span style="color: black;">"Тестовое приложение не инициализировано."</span><span style="color: red;">;</span>
<span style="color: red;">КонецЕсли</span><span style="color: red;">;</span>
ОкноПриложенияОсновноеКнопкаКомандногоИнтерфейсаПоступлениеТоваровИУслугНажать<span style="color: red;">(</span>ТестовоеПриложение<span style="color: red;">)</span><span style="color: red;">;</span>
ОкноПриложенияПоступлениеТоваровИУслугКнопкаСоздатьНажать<span style="color: red;">(</span>ТестовоеПриложение<span style="color: red;">)</span><span style="color: red;">;</span>
ОкноПриложенияПоступлениеТоваровИУслугСозданиеПолеОрганизацияВыбрать<span style="color: red;">(</span>ТестовоеПриложение<span style="color: red;">)</span><span style="color: red;">;</span>
ОкноПриложенияОрганизацииТаблицаСписокВыбрать<span style="color: red;">(</span>ТестовоеПриложение<span style="color: red;">)</span><span style="color: red;">;</span>
ОкноПриложенияПоступлениеТоваровИУслугСозданиеПолеКонтрагентВыбрать<span style="color: red;">(</span>ТестовоеПриложение<span style="color: red;">)</span><span style="color: red;">;</span>
ОкноПриложенияКонтрагентыТаблицаСписокВыбрать<span style="color: red;">(</span>ТестовоеПриложение<span style="color: red;">)</span><span style="color: red;">;</span>
ОкноПриложенияПоступлениеТоваровИУслугСозданиеПолеОтветственныйВыбрать<span style="color: red;">(</span>ТестовоеПриложение<span style="color: red;">)</span><span style="color: red;">;</span>
ОкноПриложенияСотрудникиТаблицаСписокВыбрать<span style="color: red;">(</span>ТестовоеПриложение<span style="color: red;">)</span><span style="color: red;">;</span>
ОкноПриложенияПоступлениеТоваровИУслугСозданиеКнопкаПровестиИЗакрытьНажать<span style="color: red;">(</span>ТестовоеПриложение<span style="color: red;">)</span><span style="color: red;">;</span>
РезультатТеста <span style="color: red;">=</span> ПолучитьЗначениеРезультатаТеста<span style="color: red;">(</span>КонтекстВыполнения<span style="color: red;">.</span>ИмяПользователя<span style="color: red;">)</span><span style="color: red;">;</span>
Сообщить<span style="color: red;">(</span>РезультатТеста<span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
<span style="color: brown;">&НаСервереБезКонтекста</span>
<span style="color: red;">Функция</span> ПолучитьЗначениеРезультатаТеста<span style="color: red;">(</span>ИмяПользователя<span style="color: red;">)</span>
РезультатТеста <span style="color: red;">=</span>
ХранилищеОбщихНастроек<span style="color: red;">.</span>Загрузить<span style="color: red;">(</span><span style="color: black;">"ТестовоеПриложение_ДанныеОбмена"</span><span style="color: red;">,</span> <span style="color: black;">"ПоступлениеТоваровУслуг_Запись"</span><span style="color: red;">,</span><span style="color: red;">,</span> ИмяПользователя<span style="color: red;">)</span><span style="color: red;">;</span>
ХранилищеОбщихНастроек<span style="color: red;">.</span>Удалить<span style="color: red;">(</span><span style="color: black;">"ТестовоеПриложение_ДанныеОбмена"</span><span style="color: red;">,</span> <span style="color: black;">"ПоступлениеТоваровУслуг_Запись"</span><span style="color: red;">,</span> ИмяПользователя<span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">Возврат</span> РезультатТеста<span style="color: red;">;</span>
<span style="color: red;">КонецФункции</span>
<span style="color: brown;">#Область СозданиеПоступления</span>
<span style="color: green;">// код не приводится из-за объема, сама обработка в конце статьи</span>
<span style="color: brown;">#КонецОбласти</span>
</code></pre>
<br />
Стоит учитывать, что выполнение кода на стороне клиента тестирования может происходить асинхронно. Например, при выполнении команды "Провести и закрыть" в форме документа поступления код теста на стороне менеджера не будет дожидаться закрытия формы и сразу перейдет к получению данных из хранилища настроек. Клиент тестирования, в свою очередь, не успеет поместить данные в хранилище настроек. Поэтому необходимо добавить в код ожидание закрытия формы:<br />
<br />
<pre style="color: blue;"><code class="undefined"><span style="color: blue;"> КнопкаПровестиИЗакрыть =
ОкноПриложенияПоступлениеТоваровИУслугСозданиеФормаПоступлениеТоваровИУслугСоздание.НайтиОбъект(
Тип(</span>"ТестируемаяКнопкаФормы"<span style="color: blue;">), </span>"Провести и закрыть"<span style="color: blue;">);
КнопкаПровестиИЗакрыть.Нажать();
ОкноПриложенияПоступлениеТоваровИУслугСозданиеФормаПоступлениеТоваровИУслугСоздание.ОжидатьЗакрытие();
</span></code></pre>
<br />
или выполнить нажатие на кнопку "Провести", а потом выполнить закрытие формы:<br />
<br />
<pre style="color: blue;"><code class="undefined"><span style="color: blue;"> КнопкаПровести =
ОкноПриложенияПоступлениеТоваровИУслугСозданиеФормаПоступлениеТоваровИУслугСоздание.НайтиОбъект(
Тип(</span>"ТестируемаяКнопкаФормы"<span style="color: blue;">), </span>"Провести"<span style="color: blue;">);
КнопкаПровести.Нажать();
ОкноПриложенияПоступлениеТоваровИУслугСоздание.Закрыть();
</span></code></pre>
<br />
Для использования в тесте возможностей фреймворка <a href="https://github.com/xDrivenDevelopment/xUnitFor1C" target="_blank">xUnitFor1C</a> в форму ИнициализацияТеста достаточно добавить код:<br />
<br />
<pre style="color: blue;"><code class="_1c8"><span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Перем</span> КонтекстЯдра<span style="color: red;">;</span>
<span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Перем</span> Ожидаем<span style="color: red;">;</span>
<span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Перем</span> Утверждения<span style="color: red;">;</span>
<span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Перем</span> СтроковыеУтилиты<span style="color: red;">;</span>
<span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Процедура</span> Инициализация<span style="color: red;">(</span>КонтекстЯдраПараметр<span style="color: red;">)</span> <span style="color: red;">Экспорт</span>
КонтекстЯдра <span style="color: red;">=</span> КонтекстЯдраПараметр<span style="color: red;">;</span>
Утверждения <span style="color: red;">=</span> КонтекстЯдра<span style="color: red;">.</span>Плагин<span style="color: red;">(</span><span style="color: black;">"БазовыеУтверждения"</span><span style="color: red;">)</span><span style="color: red;">;</span>
Ожидаем <span style="color: red;">=</span> КонтекстЯдра<span style="color: red;">.</span>Плагин<span style="color: red;">(</span><span style="color: black;">"УтвержденияBDD"</span><span style="color: red;">)</span><span style="color: red;">;</span>
СтроковыеУтилиты <span style="color: red;">=</span> КонтекстЯдра<span style="color: red;">.</span>Плагин<span style="color: red;">(</span><span style="color: black;">"СтроковыеУтилиты"</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
<span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Процедура</span> ЗаполнитьНаборТестов<span style="color: red;">(</span>НаборТестов<span style="color: red;">)</span> <span style="color: red;">Экспорт</span>
НаборТестов<span style="color: red;">.</span>НачатьГруппу<span style="color: red;">(</span><span style="color: black;">"ТестГруппа"</span><span style="color: red;">,</span> <span style="color: red;">Истина</span><span style="color: red;">)</span><span style="color: red;">;</span>
НаборТестов<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"ТестДолжен_ИнициализироватьТестовоеПриложение"</span><span style="color: red;">,</span> <span style="color: red;">,</span> <span style="color: black;">"Инициализация тестового приложения"</span><span style="color: red;">)</span><span style="color: red;">;</span>
НаборТестов<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"ТестДолжен_СоздатьПоступлениеТоваровУслуг"</span><span style="color: red;">,</span> <span style="color: red;">,</span> <span style="color: black;">"Создание поступления"</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
</code></pre>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj60T922jP2k7Fd6aXWfZnXO5uHhXec2z8QZBJ2I3rH8DqYMOgbHXI3ThP_MHCMJvVr8NyS9L5nXCFOQIxykkMZwu42mMBvSeNxLOnBouAQgow013EmioDXc0QNWFKqEJRl_6D2PpqkE0Nn/s1600/%25D0%2591%25D0%25B5%25D0%25B7%25D1%258B%25D0%25BC%25D1%258F%25D0%25BD%25D0%25BD%25D1%258B%25D0%25B92.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj60T922jP2k7Fd6aXWfZnXO5uHhXec2z8QZBJ2I3rH8DqYMOgbHXI3ThP_MHCMJvVr8NyS9L5nXCFOQIxykkMZwu42mMBvSeNxLOnBouAQgow013EmioDXc0QNWFKqEJRl_6D2PpqkE0Nn/s1600/%25D0%2591%25D0%25B5%25D0%25B7%25D1%258B%25D0%25BC%25D1%258F%25D0%25BD%25D0%25BD%25D1%258B%25D0%25B92.png" /></a><br />
<br />
<br />
<a href="https://drive.google.com/file/d/0B6vvASpBDRi-YldwVGxUcXplQWM/view?usp=sharing" target="_blank">Демонстрационная обработка тестирования</a>.<br />
<br /></div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com2tag:blogger.com,1999:blog-7763816944206062403.post-64641532364472931322016-10-13T23:43:00.000+03:002019-06-30T20:07:58.302+03:00Передача данных таблицы значений с сервера на клиент<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVKmJE4_7jDkVvo0Rd9mn17eS66AFr149Z-VnaNLZ9j5NjMcgEJHAWmyxzO_ea2GsLBEGXyXLSiR7dJVRwwAzPtnKSAi7SgkQ2fAr_Yk845MSK9Zqx2iKGQtzab36EQAdG29kfwxjBOYAG/s1600/%25D0%2591%25D0%25B5%25D0%25B7%25D1%258B%25D0%25BC%25D1%258F%25D0%25BD%25D0%25BD%25D1%258B%25D0%25B91.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVKmJE4_7jDkVvo0Rd9mn17eS66AFr149Z-VnaNLZ9j5NjMcgEJHAWmyxzO_ea2GsLBEGXyXLSiR7dJVRwwAzPtnKSAi7SgkQ2fAr_Yk845MSK9Zqx2iKGQtzab36EQAdG29kfwxjBOYAG/s400/%25D0%2591%25D0%25B5%25D0%25B7%25D1%258B%25D0%25BC%25D1%258F%25D0%25BD%25D0%25BD%25D1%258B%25D0%25B91.png" /></a>Навеяно публикацией на <a href="http://infostart.ru/public/504776/" target="_blank">Инфостарте</a>, с использованием передачи через XML. За идею плюс, но на мой взгляд, мудрено и многовато кода. Старый добрый способ с массивом структур прост и эффективен. Так же где то год назад добавил в копилку и успешно использую вариант с передачей на сервер копии реквизита формы, содержащего таблицу значений. Данный способ хорош тем, что при необходимости данные таблицы можно передать на сервер без остального контекста формы, не затрачивая время на перенос этих данных в тот же самый массив структур. Опять же, на стороне сервера можно использовать такие методы данной коллекции, как Выгрузить / Загрузить.<br />
<br />
<a name='more'></a>Идея в следующем: допустим, Т - реквизит формы с типом ТаблицаЗначений. Тогда процесс передачи будет выглядеть так:<br />
<br />
<pre style="color: blue;"><code class="_1c8"><span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Процедура</span> ПередатьТаблицу<span style="color: red;">(</span><span style="color: red;">)</span>
ДанныеОбработки <span style="color: red;">=</span> ОбработатьТаблицуНаСервере<span style="color: red;">(</span>Т<span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
<span style="color: brown;">&НаСервереБезКонтекста</span>
<span style="color: red;">Функция</span> ОбработатьТаблицуНаСервере<span style="color: red;">(</span><span style="color: red;">Знач</span> Т<span style="color: red;">)</span>
<span style="color: green;">//Т - копия реквизита с данными, тип ДанныеФормаКоллекция</span>
<span style="color: green;">//если необходимо, получаем таблицу значений</span>
ТЗ <span style="color: red;">=</span> Т<span style="color: red;">.</span>Выгрузить<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: green;">//Обработка таблицы значений</span>
<span style="color: green;">//...</span>
<span style="color: green;">//можно вернуть результат обратно</span>
Т<span style="color: red;">.</span>Загрузить<span style="color: red;">(</span>ТЗ<span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">Возврат</span> Т<span style="color: red;">;</span>
<span style="color: red;">КонецФункции</span></code></pre>
<br />
В качестве демонстрации набросал простую обработку. Для варианта с коллекцией формы кода получается несколько меньше, чем с массивом структур. И, как оказалось, работает побыстрее и менее затратна по передаваемому объему.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQBSXEQ29chsa1ad29axUFSQLKf_lYc5RtbFHmqC50YNBmQF4tErBsA8pZpkfWl_-2MzMvr_2Hb_RTXkFamCObSZSVwmNMwDRBS90t1v5lDZdPSYiMmwgj5CH7_zD10SWW8sjdxQjPUDGs/s1600/%25D0%2591%25D0%25B5%25D0%25B7%25D1%258B%25D0%25BC%25D1%258F%25D0%25BD%25D0%25BD%25D1%258B%25D0%25B9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQBSXEQ29chsa1ad29axUFSQLKf_lYc5RtbFHmqC50YNBmQF4tErBsA8pZpkfWl_-2MzMvr_2Hb_RTXkFamCObSZSVwmNMwDRBS90t1v5lDZdPSYiMmwgj5CH7_zD10SWW8sjdxQjPUDGs/s1600/%25D0%2591%25D0%25B5%25D0%25B7%25D1%258B%25D0%25BC%25D1%258F%25D0%25BD%25D0%25BD%25D1%258B%25D0%25B9.png" /></a></div>
<br />
<br />
<br />
<pre style="color: blue;"><code class="_1c8"><span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Процедура</span> Команда1<span style="color: red;">(</span>Команда<span style="color: red;">)</span>
ДанныеТаблицы <span style="color: red;">=</span> Команда1НаСервере<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
<span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Процедура</span> Команда2<span style="color: red;">(</span>Команда<span style="color: red;">)</span>
ДанныеТаблицы <span style="color: red;">=</span> Команда2НаСервере<span style="color: red;">(</span>Т<span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
<span style="color: brown;">&НаСервереБезКонтекста</span>
<span style="color: red;">Функция</span> Команда1НаСервере<span style="color: red;">(</span><span style="color: red;">)</span>
МассивСтрок <span style="color: red;">=</span> <span style="color: red;">Новый</span> Массив<span style="color: red;">;</span>
ТЗ <span style="color: red;">=</span> ПолучитьТестовуюТаблицу<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">Для</span> <span style="color: red;">Каждого</span> СтрокаТЗ <span style="color: red;">Из</span> ТЗ <span style="color: red;">Цикл</span>
СоставСтроки <span style="color: red;">=</span> <span style="color: red;">Новый</span> Структура<span style="color: red;">(</span><span style="color: black;">"Число1, Число2, Число3, Число4"</span><span style="color: red;">,</span> СтрокаТЗ<span style="color: red;">.</span>Число1<span style="color: red;">,</span> СтрокаТЗ<span style="color: red;">.</span>Число2<span style="color: red;">,</span> СтрокаТЗ<span style="color: red;">.</span>Число3<span style="color: red;">,</span> СтрокаТЗ<span style="color: red;">.</span>Число4<span style="color: red;">)</span><span style="color: red;">;</span>
МассивСтрок<span style="color: red;">.</span>Добавить<span style="color: red;">(</span>СоставСтроки<span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецЦикла</span><span style="color: red;">;</span>
<span style="color: red;">Возврат</span> МассивСтрок<span style="color: red;">;</span>
<span style="color: red;">КонецФункции</span>
<span style="color: brown;">&НаСервереБезКонтекста</span>
<span style="color: red;">Функция</span> Команда2НаСервере<span style="color: red;">(</span><span style="color: red;">Знач</span> Т<span style="color: red;">)</span>
Т<span style="color: red;">.</span>Загрузить<span style="color: red;">(</span>ПолучитьТестовуюТаблицу<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">Возврат</span> Т<span style="color: red;">;</span>
<span style="color: red;">КонецФункции</span>
<span style="color: brown;">&НаСервереБезКонтекста</span>
<span style="color: red;">Функция</span> ПолучитьТестовуюТаблицу<span style="color: red;">(</span><span style="color: red;">)</span>
Запрос <span style="color: red;">=</span> <span style="color: red;">Новый</span> Запрос<span style="color: red;">;</span>
Запрос<span style="color: red;">.</span>Текст <span style="color: red;">=</span>
<span style="color: black;">"ВЫБРАТЬ</span>
<span style="color: black;">| 0 КАК Число</span>
<span style="color: black;">|ПОМЕСТИТЬ Т</span>
<span style="color: black;">|</span>
<span style="color: black;">|ОБЪЕДИНИТЬ ВСЕ</span>
<span style="color: black;">|</span>
<span style="color: black;">|ВЫБРАТЬ</span>
<span style="color: black;">| 1</span>
<span style="color: black;">|</span>
<span style="color: black;">|ОБЪЕДИНИТЬ ВСЕ</span>
<span style="color: black;">|</span>
<span style="color: black;">|ВЫБРАТЬ</span>
<span style="color: black;">| 2</span>
<span style="color: black;">|</span>
<span style="color: black;">|ОБЪЕДИНИТЬ ВСЕ</span>
<span style="color: black;">|</span>
<span style="color: black;">|ВЫБРАТЬ</span>
<span style="color: black;">| 3</span>
<span style="color: black;">|</span>
<span style="color: black;">|ОБЪЕДИНИТЬ ВСЕ</span>
<span style="color: black;">|</span>
<span style="color: black;">|ВЫБРАТЬ</span>
<span style="color: black;">| 4</span>
<span style="color: black;">|</span>
<span style="color: black;">|ОБЪЕДИНИТЬ ВСЕ</span>
<span style="color: black;">|</span>
<span style="color: black;">|ВЫБРАТЬ</span>
<span style="color: black;">| 5</span>
<span style="color: black;">|</span>
<span style="color: black;">|ОБЪЕДИНИТЬ ВСЕ</span>
<span style="color: black;">|</span>
<span style="color: black;">|ВЫБРАТЬ</span>
<span style="color: black;">| 6</span>
<span style="color: black;">|</span>
<span style="color: black;">|ОБЪЕДИНИТЬ ВСЕ</span>
<span style="color: black;">|</span>
<span style="color: black;">|ВЫБРАТЬ</span>
<span style="color: black;">| 7</span>
<span style="color: black;">|</span>
<span style="color: black;">|ОБЪЕДИНИТЬ ВСЕ</span>
<span style="color: black;">|</span>
<span style="color: black;">|ВЫБРАТЬ</span>
<span style="color: black;">| 8</span>
<span style="color: black;">|</span>
<span style="color: black;">|ОБЪЕДИНИТЬ ВСЕ</span>
<span style="color: black;">|</span>
<span style="color: black;">|ВЫБРАТЬ</span>
<span style="color: black;">| 9</span>
<span style="color: black;">|;</span>
<span style="color: black;">|</span>
<span style="color: black;">|////////////////////////////////////////////////////////////////////////////////</span>
<span style="color: black;">|ВЫБРАТЬ</span>
<span style="color: black;">| Т1.Число КАК Число1,</span>
<span style="color: black;">| Т2.Число КАК Число2,</span>
<span style="color: black;">| Т3.Число КАК Число3,</span>
<span style="color: black;">| Т4.Число КАК Число4</span>
<span style="color: black;">|ИЗ</span>
<span style="color: black;">| Т КАК Т1,</span>
<span style="color: black;">| Т КАК Т2,</span>
<span style="color: black;">| Т КАК Т3,</span>
<span style="color: black;">| Т КАК Т4"</span><span style="color: red;">;</span>
<span style="color: red;">Возврат</span> Запрос<span style="color: red;">.</span><span style="color: red;">Выполнить</span><span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">.</span>Выгрузить<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецФункции</span> <span style="color: green;">// ПолучитьТестовуюТаблицу()</span>
</code></pre>
<br />
Результат замеров передачи первым и вторым способами таблицы в 10000 строк с сервера на клиент:<br />
<table cellspacing="0" style="border-collapse: collapse; font-family: Arial; font-size: 8pt; overflow: visible; padding: 0px 0px 0px 2px; table-layout: fixed; vertical-align: bottom;">
<tbody style="background: rgb(255, 255, 255); font-size: 8pt; margin: 0px;">
<tr style="display: none;">
<td width="96"></td>
<td width="123"></td>
<td width="96"></td>
</tr>
<tr style="height: 23px;">
<td style="background-color: #fafafa; border-color: rgb(160, 160, 160); border-style: solid; border-width: 1px; color: #4d4d4d; font-size: 10pt; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Время</span></td>
<td style="background-color: #fafafa; border-color: rgb(160, 160, 160); border-style: solid; border-width: 1px; color: #4d4d4d; font-size: 10pt; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Отправлено</span></td>
<td style="background-color: #fafafa; border-color: rgb(160, 160, 160); border-style: solid; border-width: 1px; color: #4d4d4d; font-size: 10pt; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">Принято</span></td>
<td></td>
</tr>
<tr style="height: 23px;">
<td style="border-color: rgb(160, 160, 160); border-style: solid; border-width: 1px; color: #333333; font-size: 10pt; text-align: right; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">1,31</span></td>
<td style="border-color: rgb(160, 160, 160); border-style: solid; border-width: 1px; color: #333333; font-size: 10pt; text-align: right; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">665</span></td>
<td style="border-color: rgb(160, 160, 160); border-style: solid; border-width: 1px; color: #333333; font-size: 10pt; text-align: right; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">4 050 476</span></td>
<td></td>
</tr>
<tr style="height: 23px;">
<td style="border-color: rgb(160, 160, 160); border-style: solid; border-width: 1px; color: #333333; font-size: 10pt; text-align: right; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">0,47</span></td>
<td style="border-color: rgb(160, 160, 160); border-style: solid; border-width: 1px; color: #333333; font-size: 10pt; text-align: right; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">1 749</span></td>
<td style="border-color: rgb(160, 160, 160); border-style: solid; border-width: 1px; color: #333333; font-size: 10pt; text-align: right; vertical-align: top;"><span style="max-width: 0px; white-space: nowrap;">979 452</span></td>
<td></td>
</tr>
</tbody>
</table>
<br />
PS: пар раз встречал упоминания, что подобный способ через копию структуры не рекомендуется, поскольку вроде как не документирован. Но конкретики, к чему это может привести, так и не увидел. Если у вас есть информация по этому поводу, будьте добры, оставьте ссылку в комментариях.<br />
<br /></div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com0tag:blogger.com,1999:blog-7763816944206062403.post-6267900462213360352016-08-17T23:04:00.000+03:002016-08-17T23:10:41.072+03:00Учебная платформа 1С - теперь бесплатно<div dir="ltr" style="text-align: left;" trbidi="on">
Буду краток :) Ссылки обнаружены на <a href="http://devtrainingforum.v8.1c.ru/forum/" target="_blank">http://devtrainingforum.v8.1c.ru/forum/</a>.<br />
<a href="http://online.1c.ru/catalog/free/18610119/" target="_blank">Платформа, "Практическое пособие разработчика" и другие книги, а так же несколько конфигураций (2,2 Гб)</a><br />
<a href="http://online.1c.ru/catalog/free/18610155/" target="_blank">Только платформа</a><br />
Для получения необходимо указать только ФИО и email, на который придет ссылка для скачивания.</div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com3tag:blogger.com,1999:blog-7763816944206062403.post-49674688643799745382016-06-11T14:28:00.000+03:002016-08-12T10:32:53.178+03:00OneScript, сделай мне много баз, бесплатно, без СМС<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_Pg96CmO-yRDon3gqo1oPX2V76mhHzymazj81ABR7UHixjgxqriChkn2WJAPyZbZDMV9mnmQDGbrJJCNw-_y34LDZjg_5EQ36Vnp_60_1UHy-N7ath4j9r8_w40iFwUy6KMRefUf2YeUD/s1600/g4299.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_Pg96CmO-yRDon3gqo1oPX2V76mhHzymazj81ABR7UHixjgxqriChkn2WJAPyZbZDMV9mnmQDGbrJJCNw-_y34LDZjg_5EQ36Vnp_60_1UHy-N7ath4j9r8_w40iFwUy6KMRefUf2YeUD/s400/g4299.png" /></a><br />
После первых экспериментов с OneScript решил сделать себе создавалку баз на сервере 1С по списку. Реализовать такую задачу можно двумя путями. Через COM-соединение с агентом сервера и запуск 1С с ключом CreateInfoBase. Решил сделать оба варианта для оценки плюсов и минусов, и само собой, ради практики. Кстати, оказалось, вовремя сделал скрипты. Коллега вчера попробовал залить дамп базы, но не угадал со свободным место на диске. В итоге файл настроек кластера повредился. Лекарство в этом случае одно - снести каталог кластера и настроить все руками заново. Как вариант, можно попробовать бэкапить все файлы *.lst в каталоге. В моем случае половина файла 1CV8Clst.lst после падения оказалась забита нулями. Но вернемся к скриптам.<br />
<a name='more'></a><br />
Скрипт настроек config.os из <a href="http://start1c.blogspot.ru/2016/06/one-script-to-rule-them-all.html" target="_blank">прошлого примера</a> расширен значениями АдминистраторКластера, ПарольАдминистратораКластера, ВерсияСервераРазработки.<br />
<br />
<pre style="color: blue;"><code class="_1c8"><span style="color: red;">Перем</span> СерверРазработки <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> КластерСервераРазработки <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> ТестоваяБаза <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> Пользователь1С <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> Пароль1С <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> ВерсияCOM_1С <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> АдминистраторКластера <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> ПарольАдминистратораКластера <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> ВерсияСервераРазработки <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> СерверSQL <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> ПользовательSQL <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> ПарольSQL <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> КаталогФайловДанных <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> КаталогФайловЖурналов <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> КаталогБэкапа <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: green;">//1С</span>
КластерСервераРазработки <span style="color: red;">=</span> <span style="color: black;">"localhost:2541"</span><span style="color: red;">;</span>
СерверРазработки <span style="color: red;">=</span> <span style="color: black;">"localhost:2540"</span><span style="color: red;">;</span>
ТестоваяБаза <span style="color: red;">=</span> <span style="color: black;">"test_base"</span><span style="color: red;">;</span>
Пользователь1С <span style="color: red;">=</span> <span style="color: black;">""</span><span style="color: red;">;</span>
Пароль1С <span style="color: red;">=</span> <span style="color: black;">""</span><span style="color: red;">;</span>
ВерсияCOM_1С <span style="color: red;">=</span> <span style="color: black;">"V83.COMConnector"</span><span style="color: red;">;</span>
АдминистраторКластера <span style="color: red;">=</span> <span style="color: black;">""</span><span style="color: red;">;</span>
ПарольАдминистратораКластера <span style="color: red;">=</span> <span style="color: black;">""</span><span style="color: red;">;</span>
ВерсияСервераРазработки <span style="color: red;">=</span> <span style="color: black;">"8.3.7.2008"</span><span style="color: red;">;</span>
<span style="color: green;">//SQL</span>
СерверSQL <span style="color: red;">=</span> <span style="color: black;">"localhost\dev"</span><span style="color: red;">;</span>
ПользовательSQL <span style="color: red;">=</span> <span style="color: black;">"sa"</span><span style="color: red;">;</span>
ПарольSQL <span style="color: red;">=</span> <span style="color: black;">""</span><span style="color: red;">;</span>
КаталогФайловДанных <span style="color: red;">=</span> <span style="color: black;">"F:\SQL_Data\BD"</span><span style="color: red;">;</span>
КаталогФайловЖурналов <span style="color: red;">=</span> <span style="color: black;">"F:\SQL_Logs\BD"</span><span style="color: red;">;</span>
КаталогБэкапа <span style="color: red;">=</span> <span style="color: black;">"F:\SQL_Backup"</span><span style="color: red;">;</span></code></pre>
<br />
Скрипт create_base_agent.os работает через COM-соединение. Недостаток этого подхода в том, что если на сервере поднято несколько кластеров 1С различных версий, то может потребоваться перерегистрация библиотеки comcntr.dll для необходимой версии.<br />
<br />
<pre style="color: blue;"><code class="_1c8"><span style="color: red;">Процедура</span> СоздатьБазыЧерезАгентКластера<span style="color: red;">(</span>СписокИмен<span style="color: red;">,</span> ПутьКШаблону <span style="color: red;">=</span> <span style="color: black;">""</span><span style="color: red;">)</span>
ПодключитьСценарий<span style="color: red;">(</span><span style="color: black;">"config.os"</span><span style="color: red;">,</span> <span style="color: black;">"ПараметрыСкрипта"</span><span style="color: red;">)</span><span style="color: red;">;</span>
Параметры <span style="color: red;">=</span> <span style="color: red;">Новый</span> ПараметрыСкрипта<span style="color: red;">;</span>
Конфигуратор <span style="color: red;">=</span> <span style="color: red;">Новый</span> УправлениеКонфигуратором<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПутьКПлатформе <span style="color: red;">=</span> Конфигуратор<span style="color: red;">.</span>ПолучитьПутьКВерсииПлатформы<span style="color: red;">(</span>Параметры<span style="color: red;">.</span>ВерсияСервераРазработки<span style="color: red;">)</span><span style="color: red;">;</span>
Конфигуратор<span style="color: red;">.</span>ПутьКПлатформе1С<span style="color: red;">(</span>ПутьКПлатформе<span style="color: red;">)</span><span style="color: red;">;</span>
Коннектор <span style="color: red;">=</span> <span style="color: red;">Новый</span> COMОбъект<span style="color: red;">(</span>Параметры<span style="color: red;">.</span>ВерсияCOM_1С<span style="color: red;">)</span><span style="color: red;">;</span>
АгентСервера <span style="color: red;">=</span> Коннектор<span style="color: red;">.</span>ConnectAgent<span style="color: red;">(</span>Параметры<span style="color: red;">.</span>СерверРазработки<span style="color: red;">)</span><span style="color: red;">;</span>
Кластеры <span style="color: red;">=</span> АгентСервера<span style="color: red;">.</span>getClusters<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
Кластер <span style="color: red;">=</span> Кластеры<span style="color: red;">[<span style="color: black;">0</span></span><span style="color: red;">]</span><span style="color: red;">;</span>
АгентСервера<span style="color: red;">.</span>Authenticate<span style="color: red;">(</span>Кластер<span style="color: red;">,</span> Параметры<span style="color: red;">.</span>АдминистраторКластера<span style="color: red;">,</span> Параметры<span style="color: red;">.</span>ПарольАдминистратораКластера<span style="color: red;">)</span><span style="color: red;">;</span>
Процессы <span style="color: red;">=</span> АгентСервера<span style="color: red;">.</span>GetWorkingProcesses<span style="color: red;">(</span>Кластер<span style="color: red;">)</span><span style="color: red;">;</span>
РабочийПроцесс <span style="color: red;">=</span> Коннектор<span style="color: red;">.</span>ConnectWorkingProcess<span style="color: red;">(</span>Процессы<span style="color: red;">[<span style="color: black;">0</span></span><span style="color: red;">]</span><span style="color: red;">.</span>HostName <span style="color: red;">+</span> <span style="color: black;">":"</span>
<span style="color: red;">+</span> СтрЗаменить<span style="color: red;">(</span>Процессы<span style="color: red;">[<span style="color: black;">0</span></span><span style="color: red;">]</span><span style="color: red;">.</span>MainPort<span style="color: red;">,</span> Символы<span style="color: red;">.</span>НПП<span style="color: red;">,</span> <span style="color: black;">""</span><span style="color: red;">)</span><span style="color: red;">)</span><span style="color: red;">;</span>
ШаблонБазы <span style="color: red;">=</span> РабочийПроцесс<span style="color: red;">.</span>CreateInfoBaseInfo<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">Для</span> <span style="color: red;">Каждого</span> БазаИмя <span style="color: red;">Из</span> СписокИмен <span style="color: red;">Цикл</span>
ШаблонБазы<span style="color: red;">.</span>Name <span style="color: red;">=</span> БазаИмя<span style="color: red;">.</span>Значение<span style="color: red;">;</span>
ШаблонБазы<span style="color: red;">.</span>DBMS <span style="color: red;">=</span> <span style="color: black;">"MSSQLServer"</span><span style="color: red;">;</span>
ШаблонБазы<span style="color: red;">.</span>dbName <span style="color: red;">=</span> БазаИмя<span style="color: red;">.</span>Значение<span style="color: red;">;</span>
ШаблонБазы<span style="color: red;">.</span>Descr <span style="color: red;">=</span> <span style="color: red;">?</span><span style="color: red;">(</span>ПустаяСтрока<span style="color: red;">(</span>БазаИмя<span style="color: red;">.</span>Представление<span style="color: red;">)</span><span style="color: red;">,</span> БазаИмя<span style="color: red;">.</span>Значение<span style="color: red;">,</span> БазаИмя<span style="color: red;">.</span>Представление<span style="color: red;">)</span><span style="color: red;">;</span>
ШаблонБазы<span style="color: red;">.</span>dbServerName <span style="color: red;">=</span> Параметры<span style="color: red;">.</span>СерверSQL<span style="color: red;">;</span>
ШаблонБазы<span style="color: red;">.</span>dbUser <span style="color: red;">=</span> Параметры<span style="color: red;">.</span>ПользовательSQL<span style="color: red;">;</span>
ШаблонБазы<span style="color: red;">.</span>dbPassword <span style="color: red;">=</span> Параметры<span style="color: red;">.</span>ПарольSQL<span style="color: red;">;</span>
ШаблонБазы<span style="color: red;">.</span>Locale <span style="color: red;">=</span> <span style="color: black;">"ru_Ru"</span><span style="color: red;">;</span>
ШаблонБазы<span style="color: red;">.</span>DateOffset <span style="color: red;">=</span> <span style="color: black;">2000</span><span style="color: red;">;</span>
ШаблонБазы<span style="color: red;">.</span>ScheduledJobsDenied <span style="color: red;">=</span> <span style="color: red;">Истина</span><span style="color: red;">;</span>
РабочийПроцесс<span style="color: red;">.</span>CreateInfoBase<span style="color: red;">(</span>ШаблонБазы<span style="color: red;">,</span> <span style="color: black;">1</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">Если</span> <span style="color: red;">НЕ</span> ПустаяСтрока<span style="color: red;">(</span>ПутьКШаблону<span style="color: red;">)</span> <span style="color: red;">Тогда</span>
Конфигуратор<span style="color: red;">.</span>УстановитьКонтекст<span style="color: red;">(</span><span style="color: black;">"/IBConnectionString""Srvr="</span>
<span style="color: red;">+</span> Параметры<span style="color: red;">.</span>КластерСервераРазработки <span style="color: red;">+</span> <span style="color: black;">"; Ref='"</span> <span style="color: red;">+</span> БазаИмя<span style="color: red;">.</span>Значение <span style="color: red;">+</span> <span style="color: black;">"'"""</span><span style="color: red;">,</span><span style="color: black;">""</span><span style="color: red;">,</span> <span style="color: black;">""</span><span style="color: red;">)</span><span style="color: red;">;</span>
РасширениеШаблона <span style="color: red;">=</span> Прав<span style="color: red;">(</span>ПутьКШаблону<span style="color: red;">,</span> <span style="color: black;">2</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">Если</span> РасширениеШаблона <span style="color: red;">=</span> <span style="color: black;">"dt"</span> <span style="color: red;">Тогда</span>
Конфигуратор<span style="color: red;">.</span>ЗагрузитьИнформационнуюБазу<span style="color: red;">(</span>ПутьКШаблону<span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">ИначеЕсли</span> РасширениеШаблона <span style="color: red;">=</span> <span style="color: black;">"cf"</span> <span style="color: red;">Тогда</span>
Конфигуратор<span style="color: red;">.</span>ЗагрузитьКонфигурациюИзФайла<span style="color: red;">(</span>ПутьКШаблону<span style="color: red;">,</span> <span style="color: red;">Истина</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">Иначе</span>
<span style="color: red;">Продолжить</span><span style="color: red;">;</span>
<span style="color: red;">КонецЕсли</span><span style="color: red;">;</span>
<span style="color: red;">КонецЕсли</span><span style="color: red;">;</span>
<span style="color: red;">КонецЦикла</span><span style="color: red;">;</span>
РабочийПроцесс <span style="color: red;">=</span> <span style="color: red;">Неопределено</span><span style="color: red;">;</span>
Коннектор <span style="color: red;">=</span> <span style="color: red;">Неопределено</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
ПутьКШаблону <span style="color: red;">=</span> <span style="color: black;">"E:\1c\templates\cf\1cv8_test.cf"</span><span style="color: red;">;</span> <span style="color: green;">//*.cf, *.dt</span>
мБазы <span style="color: red;">=</span> <span style="color: red;">Новый</span> СписокЗначений<span style="color: red;">;</span>
мБазы<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"test_base_1"</span><span style="color: red;">)</span><span style="color: red;">;</span>
мБазы<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"test_base_2"</span><span style="color: red;">)</span><span style="color: red;">;</span>
СоздатьБазыЧерезАгентКластера<span style="color: red;">(</span>мБазы<span style="color: red;">,</span> ПутьКШаблону<span style="color: red;">)</span><span style="color: red;">;</span></code></pre>
<br />
Второй вариант скрипта потребует модификации файла v8runner.os, идущего в поставке OneScript. По умолчанию располагается в каталоге установки OneScript \lib\v8runner\src.<br />
<br />
Скрипт create_base_batch.os по сравнению с предыдущим скриптом,на мой взгляд, более практичен, поскольку нет необходимости манипуляций с библиотекой COM-соединений.<br />
<br />
<pre style="color: blue;"><code class="_1c8"><span style="color: brown;">#Использовать v8runner</span>
<span style="color: red;">Процедура</span> СоздатьБазыЧерезПакетныйРежим<span style="color: red;">(</span>СписокИмен<span style="color: red;">,</span> <span style="color: red;">Знач</span> ПутьКШаблону<span style="color: red;">=</span><span style="color: black;">""</span><span style="color: red;">)</span>
ПодключитьСценарий<span style="color: red;">(</span><span style="color: black;">"config.os"</span><span style="color: red;">,</span> <span style="color: black;">"ПараметрыСкрипта"</span><span style="color: red;">)</span><span style="color: red;">;</span>
Параметры <span style="color: red;">=</span> <span style="color: red;">Новый</span> ПараметрыСкрипта<span style="color: red;">;</span>
Конфигуратор <span style="color: red;">=</span> <span style="color: red;">Новый</span> УправлениеКонфигуратором<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПутьКПлатформе <span style="color: red;">=</span> Конфигуратор<span style="color: red;">.</span>ПолучитьПутьКВерсииПлатформы<span style="color: red;">(</span>Параметры<span style="color: red;">.</span>ВерсияСервераРазработки<span style="color: red;">)</span><span style="color: red;">;</span>
Конфигуратор<span style="color: red;">.</span>ПутьКПлатформе1С<span style="color: red;">(</span>ПутьКПлатформе<span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">Для</span> <span style="color: red;">Каждого</span> БазаИмя <span style="color: red;">Из</span> СписокИмен <span style="color: red;">Цикл</span>
Конфигуратор<span style="color: red;">.</span>СоздатьБазуSQL<span style="color: red;">(</span>БазаИмя<span style="color: red;">.</span>Значение<span style="color: red;">,</span> Параметры<span style="color: red;">,</span> ПутьКШаблону<span style="color: red;">,</span> БазаИмя<span style="color: red;">.</span>Представление<span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецЦикла</span>
<span style="color: red;">КонецПроцедуры</span>
ПутьКШаблону <span style="color: red;">=</span> <span style="color: black;">"E:\1c\templates\cf\1cv8_test.cf"</span><span style="color: red;">;</span> <span style="color: green;">//*.cf, *.dt</span>
мБазы <span style="color: red;">=</span> <span style="color: red;">Новый</span> СписокЗначений<span style="color: red;">;</span>
мБазы<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"test_base_1"</span><span style="color: red;">)</span><span style="color: red;">;</span>
мБазы<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"test_base_2"</span><span style="color: red;">)</span><span style="color: red;">;</span>
СоздатьБазыЧерезПакетныйРежим<span style="color: red;">(</span>мБазы<span style="color: red;">,</span> ПутьКШаблону<span style="color: red;">)</span><span style="color: red;">;</span></code></pre>
<br />
v8runner.os<br />
<br />
<pre style="color: blue;"><code class="_1c8"><span style="color: red;">Процедура</span> СоздатьБазуSQL<span style="color: red;">(</span><span style="color: red;">Знач</span> ИмяБазы<span style="color: red;">,</span> <span style="color: red;">Знач</span> Параметры<span style="color: red;">,</span> <span style="color: red;">Знач</span> ПутьКШаблону<span style="color: red;">=</span><span style="color: black;">""</span><span style="color: red;">,</span> <span style="color: red;">Знач</span> ИмяБазыВСписке<span style="color: red;">=</span><span style="color: black;">""</span><span style="color: red;">)</span> <span style="color: red;">Экспорт</span>
Лог<span style="color: red;">.</span>Отладка<span style="color: red;">(</span><span style="color: black;">"Создаю базу SQL "</span><span style="color: red;">+</span>ИмяБазы<span style="color: red;">)</span><span style="color: red;">;</span>
ПараметрыЗапуска <span style="color: red;">=</span> <span style="color: red;">Новый</span> Массив<span style="color: red;">;</span>
ПараметрыЗапуска<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"CREATEINFOBASE"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПараметрыЗапуска<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"Srvr="""</span> <span style="color: red;">+</span> Параметры<span style="color: red;">.</span>КластерСервераРазработки <span style="color: red;">+</span> <span style="color: black;">""";"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПараметрыЗапуска<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"Ref="""</span> <span style="color: red;">+</span> ИмяБазы <span style="color: red;">+</span> <span style="color: black;">""";"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПараметрыЗапуска<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"DBMS="""</span> <span style="color: red;">+</span> <span style="color: black;">"MSSQLServer"</span> <span style="color: red;">+</span> <span style="color: black;">""";"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПараметрыЗапуска<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"DBSrvr="""</span> <span style="color: red;">+</span> Параметры<span style="color: red;">.</span>СерверSQL <span style="color: red;">+</span> <span style="color: black;">""";"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПараметрыЗапуска<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"DB="""</span> <span style="color: red;">+</span> ИмяБазы <span style="color: red;">+</span> <span style="color: black;">""";"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПараметрыЗапуска<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"DBUID="""</span> <span style="color: red;">+</span> Параметры<span style="color: red;">.</span>ПользовательSQL <span style="color: red;">+</span> <span style="color: black;">""";"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПараметрыЗапуска<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"DBPwd="""</span> <span style="color: red;">+</span> Параметры<span style="color: red;">.</span>ПарольSQL <span style="color: red;">+</span> <span style="color: black;">""";"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПараметрыЗапуска<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"SQLYOffs="""</span> <span style="color: red;">+</span> <span style="color: black;">"2000"</span> <span style="color: red;">+</span> <span style="color: black;">""";"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПараметрыЗапуска<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"Locale="""</span> <span style="color: red;">+</span> <span style="color: black;">"Ru_ru"</span> <span style="color: red;">+</span> <span style="color: black;">""";"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПараметрыЗапуска<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"CrSQLDB="""</span> <span style="color: red;">+</span> <span style="color: black;">"Y"</span> <span style="color: red;">+</span> <span style="color: black;">""";"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПараметрыЗапуска<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"SchJobDn="""</span> <span style="color: red;">+</span> <span style="color: black;">"Y"</span> <span style="color: red;">+</span> <span style="color: black;">""";"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПараметрыЗапуска<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"LicDstr="""</span> <span style="color: red;">+</span> <span style="color: black;">"Y"</span> <span style="color: red;">+</span> <span style="color: black;">""";"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПараметрыЗапуска<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"SUsr="""</span> <span style="color: red;">+</span> Параметры<span style="color: red;">.</span>АдминистраторКластера <span style="color: red;">+</span> <span style="color: black;">""";"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПараметрыЗапуска<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"SPwd="""</span> <span style="color: red;">+</span> Параметры<span style="color: red;">.</span>ПарольАдминистратораКластера <span style="color: red;">+</span> <span style="color: black;">""";"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПараметрыЗапуска<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"/Out"""</span> <span style="color: red;">+</span> ФайлИнформации<span style="color: red;">(</span><span style="color: red;">)</span> <span style="color: red;">+</span> <span style="color: black;">""""</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">Если</span> ИмяБазыВСписке <span style="color: red;"><</span><span style="color: red;">></span> <span style="color: black;">""</span> <span style="color: red;">Тогда</span>
ПараметрыЗапуска<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"/AddInList"""</span><span style="color: red;">+</span> ИмяБазыВСписке <span style="color: red;">+</span> <span style="color: black;">""""</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецЕсли</span><span style="color: red;">;</span>
<span style="color: red;">Если</span> ПутьКШаблону<span style="color: red;"><</span><span style="color: red;">></span> <span style="color: black;">""</span> <span style="color: red;">Тогда</span>
ПараметрыЗапуска<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"/UseTemplate"""</span><span style="color: red;">+</span> ПутьКШаблону <span style="color: red;">+</span> <span style="color: black;">""""</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецЕсли</span><span style="color: red;">;</span>
КодВозврата <span style="color: red;">=</span> ЗапуститьИПодождать<span style="color: red;">(</span>ПараметрыЗапуска<span style="color: red;">)</span><span style="color: red;">;</span>
УстановитьВывод<span style="color: red;">(</span>ПрочитатьФайлИнформации<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">Если</span> КодВозврата <span style="color: red;"><</span><span style="color: red;">></span> <span style="color: black;">0</span> <span style="color: red;">Тогда</span>
<span style="color: red;">ВызватьИсключение</span> ВыводКоманды<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецЕсли</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span></code></pre>
<br /></div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com0tag:blogger.com,1999:blog-7763816944206062403.post-25125237561885355602016-06-05T21:19:00.000+03:002016-06-06T20:13:47.280+03:00One Script to rule them all<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAcf41OrcTqmnf0Z5EVXG7d9dCAaZl8h4frJAxdasm5nkBws8CHM9jfKyTIT_9293AiSBMZOcy6bhfLHzJdlrnqa_mz8zkv-OPag0V73BLdURFhQLoQEamc4jnAM-9jq09dqZlqJHN7ERq/s1600/logo1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAcf41OrcTqmnf0Z5EVXG7d9dCAaZl8h4frJAxdasm5nkBws8CHM9jfKyTIT_9293AiSBMZOcy6bhfLHzJdlrnqa_mz8zkv-OPag0V73BLdURFhQLoQEamc4jnAM-9jq09dqZlqJHN7ERq/s400/logo1.png" /></a><br />
Говорят, хороший программист должен быть ленивым. Больше думать, меньше писать, использовать готовый код. А так же автоматизировать некоторые свои рутинные ручные операции. В последнем случае можно использовать такие языки, как VBS, Python. Для самых "ленивых" 1С-ников, которые хотят автоматизироваться уже прямо сейчас, без изучения нового языка, существует проект <a href="http://oscript.io/" target="_blank">OneScript (1Script)</a>. Скрипты для него пишутся на языке 1С, наличие платформы не обязательно.<br />
Разработка рекомендована к ознакомлению и применению. Можно долго расписывать все плюсы использования скриптов. Но лучше попробовать самостоятельно написать какой-нибудь простой сценарий, чтобы войти во вкус. В качестве примера приведу свой скрипт запуска тестирования и исправления базы. Сначала производится восстановление последнего полного бэкапа SQL в тестовую базу. Затем запускается процесс ТИС, лог результата сохраняется в каталог со скриптом. Запуск скрипта можно сделать по расписанию, чтобы на начало рабочего дня иметь результат тестирования.<br />
<a name='more'></a><br />
tis_test.os - запускаемый файл<br />
<br />
<pre style="color: blue;"><code class="_1c8"><span style="color: brown;">#Использовать v8runner</span>
БазаИсточник <span style="color: red;">=</span> <span style="color: black;">"база_источник_на_SQL"</span><span style="color: red;">;</span>
БазаПриемник <span style="color: red;">=</span> <span style="color: black;">"база_приемник_на_SQL<span style="color: black;">"</span><span style="color: red;">;</span></span>
ПодключитьСценарий<span style="color: red;">(</span><span style="color: black;">"config.os"</span><span style="color: red;">,</span> <span style="color: black;">"ПараметрыСкрипта"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПодключитьСценарий<span style="color: red;">(</span><span style="color: black;">"sql.os"</span><span style="color: red;">,</span> <span style="color: black;">"МенеджерSQL"</span><span style="color: red;">)</span><span style="color: red;">;</span>
Параметры <span style="color: red;">=</span> <span style="color: red;">Новый</span> ПараметрыСкрипта<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
МенеджерSQL <span style="color: red;">=</span> <span style="color: red;">Новый</span> МенеджерSQL<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
СоединениеSQL <span style="color: red;">=</span> МенеджерSQL<span style="color: red;">.</span>ПодключитьSQL<span style="color: red;">(</span>Параметры<span style="color: red;">.</span>СерверSQL<span style="color: red;">,</span> Параметры<span style="color: red;">.</span>ПользовательSQL<span style="color: red;">,</span>
</code>Параметры<span style="color: red;">.</span>ПарольSQL<span style="color: red;">)</span><span style="color: red;">;</span></pre>
<pre style="color: blue;"><code class="_1c8"><span style="color: red;">Если</span> СоединениеSQL <span style="color: red;">=</span> <span style="color: red;">Неопределено</span> <span style="color: red;">Тогда</span>
Сообщить<span style="color: red;">(</span><span style="color: black;">"Ошибка подключения к SQL."</span><span style="color: red;">)</span><span style="color: red;">;</span>
ЗавершитьРаботу<span style="color: red;">(<span style="color: black;">1</span></span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецЕсли</span><span style="color: red;">;</span>
Сообщить<span style="color: red;">(</span><span style="color: black;">"Восставновление последнего бэкапа."</span><span style="color: red;">)</span><span style="color: red;">;</span>
МенеджерSQL<span style="color: red;">.</span>ВосстановитьПоследнийПолныйБэкап<span style="color: red;">(</span>СоединениеSQL<span style="color: red;">,</span> БазаИсточник<span style="color: red;">,</span> </code></pre>
<pre style="color: blue;"><code class="_1c8">БазаПриемник<span style="color: red;">,</span> Параметры<span style="color: red;">)</span><span style="color: red;">;</span>
СоединениеSQL <span style="color: red;">=</span> <span style="color: red;">Неопределено</span><span style="color: red;">;</span>
Сообщить<span style="color: red;">(</span><span style="color: black;">"Запуск тестирования/исправления."</span><span style="color: red;">)</span><span style="color: red;">;</span>
Конфигуратор <span style="color: red;">=</span> <span style="color: red;">Новый</span> УправлениеКонфигуратором<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
Конфигуратор<span style="color: red;">.</span>УстановитьКонтекст<span style="color: red;">(</span><span style="color: black;">"/IBConnectionString"""</span> <span style="color: red;">+</span> Параметры<span style="color: red;">.</span>СерверРазработки <span style="color: red;">+</span>
</code><span style="color: black;">"; Ref='"</span> <span style="color: red;">+</span> БазаПриемник <span style="color: red;">+</span> <span style="color: black;">"'"""</span><span style="color: red;">,</span> Параметры<span style="color: red;">.</span>Пользователь1С<span style="color: red;">,</span> Параметры<span style="color: red;">.</span>Пароль1С<span style="color: red;">)</span><span style="color: red;">;</span></pre>
<pre style="color: blue;"><code class="_1c8">ПараметрыЗапуска <span style="color: red;">=</span> Конфигуратор<span style="color: red;">.</span>ПолучитьПараметрыЗапуска<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПараметрыЗапуска<span style="color: red;">.</span>Добавить<span style="color: red;">(</span><span style="color: black;">"/IBCheckAndRepair -LogAndRefsIntegrity -TestOnly -BadRefNone -BadDataNone"</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">Попытка</span>
Конфигуратор<span style="color: red;">.</span>ВыполнитьКоманду<span style="color: red;">(</span>ПараметрыЗапуска<span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">Исключение</span>
Сообщить<span style="color: red;">(</span>Конфигуратор<span style="color: red;">.</span>ВыводКоманды<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПопытки</span>
</code></pre>
<br />
config.os - файл настроек<br />
<br />
<pre style="color: blue;"><code class="_1c8"><span style="color: red;">Перем</span> СерверРазработки <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> ТестоваяБаза <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> Пользователь1С <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> Пароль1С <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> СерверSQL <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> ПользовательSQL <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> ПарольSQL <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> КаталогФайловДанных <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> КаталогФайловЖурналов <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: red;">Перем</span> КаталогБэкапа <span style="color: red;">Экспорт</span><span style="color: red;">;</span>
<span style="color: green;">//1С</span>
СерверРазработки <span style="color: red;">=</span> <span style="color: black;">"мой_сервер_разработки"</span><span style="color: red;">;</span>
ТестоваяБаза <span style="color: red;">=</span> <span style="color: black;">"моя_тестовая_база"</span><span style="color: red;">;</span>
Пользователь1С <span style="color: red;">=</span> <span style="color: black;">"пользователь_базы"</span><span style="color: red;">;</span>
Пароль1С <span style="color: red;">=</span> <span style="color: black;">"пароль_пользователя"</span><span style="color: red;">;</span>
<span style="color: green;">//SQL</span>
СерверSQL <span style="color: red;">=</span> <span style="color: black;">"сервер_БД"</span><span style="color: red;">;</span>
ПользовательSQL <span style="color: red;">=</span> <span style="color: black;">"пользователь"</span><span style="color: red;">;</span>
ПарольSQL <span style="color: red;">=</span> <span style="color: black;">"пароль_пользователя"</span><span style="color: red;">;</span>
КаталогФайловДанных <span style="color: red;">=</span> <span style="color: black;">"путь_к_файлам_данных"</span><span style="color: red;">;</span>
КаталогФайловЖурналов <span style="color: red;">=</span> <span style="color: black;">"путь_к_файлам_журналов<span style="color: black;">"</span><span style="color: red;">;</span></span>КаталогБэкапа <span style="color: red;">=</span> <span style="color: black;">"путь_к_бэкапам"</span><span style="color: red;">;</span></code></pre>
<br />
sql.os - подключаемые функции для работы с SQL<br />
<br />
<pre style="color: blue;"><code class="_1c8"><span style="color: red;">Функция</span> ПодключитьSQL<span style="color: red;">(</span>СерверSQL<span style="color: red;">,</span> ПользовательSQL<span style="color: red;">,</span> ПарольSQL<span style="color: red;">)</span> <span style="color: red;">Экспорт</span>
<span style="color: red;">Перем</span> Command<span style="color: red;">;</span>
СтрокаПодключения <span style="color: red;">=</span>
<span style="color: black;">"DRIVER={SQL Server};</span>
<span style="color: black;">|UID="</span> <span style="color: red;">+</span> ПользовательSQL <span style="color: red;">+</span> <span style="color: black;">";</span>
<span style="color: black;">|Pwd="</span> <span style="color: red;">+</span> ПарольSQL <span style="color: red;">+</span> <span style="color: black;">";</span>
<span style="color: black;">|Server="</span> <span style="color: red;">+</span> СерверSQL <span style="color: red;">+</span><span style="color: black;">";"</span><span style="color: red;">;</span>
<span style="color: red;">Попытка</span>
Connection <span style="color: red;">=</span> <span style="color: red;">Новый</span> COMОбъект<span style="color: red;">(</span><span style="color: black;">"ADODB.Connection"</span><span style="color: red;">)</span><span style="color: red;">;</span>
Command <span style="color: red;">=</span> <span style="color: red;">Новый</span> COMОбъект<span style="color: red;">(</span><span style="color: black;">"ADODB.Command"</span><span style="color: red;">)</span><span style="color: red;">;</span>
Connection<span style="color: red;">.</span>Open<span style="color: red;">(</span>СокрЛП<span style="color: red;">(</span>СтрокаПодключения<span style="color: red;">)</span><span style="color: red;">)</span><span style="color: red;">;</span>
Command<span style="color: red;">.</span>ActiveConnection <span style="color: red;">=</span> Connection<span style="color: red;">;</span>
<span style="color: red;">Исключение</span>
Сообщить<span style="color: red;">(</span>ОписаниеОшибки<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПопытки</span><span style="color: red;">;</span>
<span style="color: red;">Возврат</span> Command<span style="color: red;">;</span>
<span style="color: red;">КонецФункции</span>
<span style="color: red;">Процедура</span> СоздатьПолныйБэкап<span style="color: red;">(</span>СоединениеSQL<span style="color: red;">,</span> БазаSQL<span style="color: red;">,</span> КаталогБэкапа<span style="color: red;">)</span> <span style="color: red;">Экспорт</span>
ТекстЗапроса <span style="color: red;">=</span>
<span style="color: black;">"BACKUP DATABASE ["</span> <span style="color: red;">+</span> БазаSQL <span style="color: red;">+</span> <span style="color: black;">"] TO </span>
<span style="color: black;">|DISK = N'"</span> <span style="color: red;">+</span> КаталогБэкапа <span style="color: red;">+</span> <span style="color: black;">"\"</span> <span style="color: red;">+</span> БазаSQL <span style="color: red;">+</span> <span style="color: black;">".bak' WITH NOFORMAT, </span>
<span style="color: black;">|NOINIT, NAME = N'"</span> <span style="color: red;">+</span> БазаSQL <span style="color: red;">+</span> <span style="color: black;">" full', SKIP, NOREWIND, NOUNLOAD, STATS = 10"</span><span style="color: red;">;</span>
СоединениеSQL<span style="color: red;">.</span>CommandText <span style="color: red;">=</span> ТекстЗапроса<span style="color: red;">;</span>
СоединениеSQL<span style="color: red;">.</span><span style="color: red;">Execute</span><span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
<span style="color: red;">Функция</span> ПолучитьПоследнийФайлПолногоБэкапа<span style="color: red;">(</span>СоединениеSQL<span style="color: red;">,</span> БазаSQL<span style="color: red;">)</span> <span style="color: red;">Экспорт</span>
<span style="color: red;">Перем</span> Результат<span style="color: red;">;</span>
ТекстЗапроса <span style="color: red;">=</span>
<span style="color: black;">"SELECT </span>
<span style="color: black;">| B.physical_device_name</span>
<span style="color: black;">|FROM </span>
<span style="color: black;">| ( </span>
<span style="color: black;">| SELECT </span>
<span style="color: black;">| CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server, </span>
<span style="color: black;">| msdb.dbo.backupset.database_name, </span>
<span style="color: black;">| MAX(msdb.dbo.backupset.backup_finish_date) AS last_db_backup_date </span>
<span style="color: black;">| FROM msdb.dbo.backupmediafamily </span>
<span style="color: black;">| INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id </span>
<span style="color: black;">| WHERE msdb..backupset.type = 'D' AND msdb.dbo.backupset.database_name = '"</span> <span style="color: red;">+</span> БазаSQL <span style="color: red;">+</span> <span style="color: black;">"'</span>
<span style="color: black;">| GROUP BY </span>
<span style="color: black;">| msdb.dbo.backupset.database_name </span>
<span style="color: black;">| ) AS A </span>
<span style="color: black;">| </span>
<span style="color: black;">| LEFT JOIN </span>
<span style="color: black;">|</span>
<span style="color: black;">| ( </span>
<span style="color: black;">| SELECT </span>
<span style="color: black;">| CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server, </span>
<span style="color: black;">| msdb.dbo.backupset.database_name, </span>
<span style="color: black;">| msdb.dbo.backupset.backup_finish_date, </span>
<span style="color: black;">| msdb.dbo.backupmediafamily.physical_device_name</span>
<span style="color: black;">|FROM msdb.dbo.backupmediafamily </span>
<span style="color: black;">| INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id </span>
<span style="color: black;">|WHERE msdb..backupset.type = 'D' AND msdb.dbo.backupset.database_name = '"</span> <span style="color: red;">+</span> БазаSQL <span style="color: red;">+</span> <span style="color: black;">"'</span>
<span style="color: black;">| ) AS B </span>
<span style="color: black;">| ON A.[server] = B.[server] AND A.[database_name] = B.[database_name] AND A.[last_db_backup_date] = B.[backup_finish_date]"</span><span style="color: red;">;</span>
СоединениеSQL<span style="color: red;">.</span>CommandText <span style="color: red;">=</span> ТекстЗапроса<span style="color: red;">;</span>
RecordSet <span style="color: red;">=</span> СоединениеSQL<span style="color: red;">.</span><span style="color: red;">Execute</span><span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
RecordSet<span style="color: red;">.</span>MoveFirst<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
Результат <span style="color: red;">=</span> RecordSet<span style="color: red;">.</span>Fields<span style="color: red;">[</span><span style="color: black;">"physical_device_name"</span><span style="color: red;">]</span><span style="color: red;">.</span>Value<span style="color: red;">;</span>
<span style="color: red;">Возврат</span> Результат<span style="color: red;">;</span>
<span style="color: red;">КонецФункции</span>
<span style="color: red;">Процедура</span> ВосстановитьПоследнийПолныйБэкап<span style="color: red;">(</span>СоединениеSQL<span style="color: red;">,</span> БазаSQL<span style="color: red;">,</span> ЦелеваяБазаSQL<span style="color: red;">,</span> Параметры<span style="color: red;">)</span> <span style="color: red;">Экспорт</span>
ФайлБэкапа <span style="color: red;">=</span> ПолучитьПоследнийФайлПолногоБэкапа<span style="color: red;">(</span>СоединениеSQL<span style="color: red;">,</span> БазаSQL<span style="color: red;">)</span><span style="color: red;">;</span>
ФайлыБазы <span style="color: red;">=</span> ПолучитьФайлыБазы<span style="color: red;">(</span>СоединениеSQL<span style="color: red;">,</span> БазаSQL<span style="color: red;">)</span><span style="color: red;">;</span>
ДатаСтрока <span style="color: red;">=</span> СтрРазделить<span style="color: red;">(</span>XMLСтрока<span style="color: red;">(</span>ТекущаяДата<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">)</span><span style="color: red;">,</span> <span style="color: black;">"T"</span><span style="color: red;">,</span> <span style="color: red;">Истина</span><span style="color: red;">)</span><span style="color: red;">[<span style="color: black;">0</span></span><span style="color: red;">]</span><span style="color: red;">;</span>
ТекстЗапроса <span style="color: red;">=</span>
<span style="color: black;">"USE [master]</span>
<span style="color: black;">|RESTORE DATABASE ["</span> <span style="color: red;">+</span> ЦелеваяБазаSQL <span style="color: red;">+</span> <span style="color: black;">"] FROM DISK = N'"</span> <span style="color: red;">+</span> ФайлБэкапа <span style="color: red;">+</span> <span style="color: black;">"' WITH FILE = 1"</span><span style="color: red;">;</span>
<span style="color: red;">Для</span> <span style="color: red;">Каждого</span> ФайлБазы <span style="color: red;">Из</span> ФайлыБазы <span style="color: red;">Цикл</span>
<span style="color: red;">Если</span> ФайлБазы<span style="color: red;">.</span>type_desc <span style="color: red;">=</span> <span style="color: black;">"ROWS"</span> <span style="color: red;">Тогда</span>
КаталогРазмещения <span style="color: red;">=</span> Параметры<span style="color: red;">.</span>КаталогФайловДанных<span style="color: red;">;</span>
ПостфиксФайла <span style="color: red;">=</span> <span style="color: black;">".mdf'"</span><span style="color: red;">;</span>
<span style="color: red;">ИначеЕсли</span> ФайлБазы<span style="color: red;">.</span>type_desc <span style="color: red;">=</span> <span style="color: black;">"LOG"</span> <span style="color: red;">Тогда</span>
КаталогРазмещения <span style="color: red;">=</span> Параметры<span style="color: red;">.</span>КаталогФайловЖурналов<span style="color: red;">;</span>
ПостфиксФайла <span style="color: red;">=</span> <span style="color: black;">"_log.ldf'"</span><span style="color: red;">;</span>
<span style="color: red;">Иначе</span>
Сообщить<span style="color: red;">(</span><span style="color: black;">"Неопределенный тип файла данных"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ЗавершитьРаботу<span style="color: red;">(<span style="color: black;">1</span></span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецЕсли</span><span style="color: red;">;</span>
ТекстЗапроса <span style="color: red;">=</span> ТекстЗапроса <span style="color: red;">+</span> <span style="color: black;">"</span>
<span style="color: black;">|, MOVE N'"</span> <span style="color: red;">+</span> ФайлБазы<span style="color: red;">.</span>name <span style="color: red;">+</span> <span style="color: black;">"' TO N'"</span> <span style="color: red;">+</span> КаталогРазмещения <span style="color: red;">+</span> <span style="color: black;">"\"</span> <span style="color: red;">+</span>
ЦелеваяБазаSQL <span style="color: red;">+</span> <span style="color: black;">"_"</span> <span style="color: red;">+</span> ДатаСтрока <span style="color: red;">+</span> ПостфиксФайла<span style="color: red;">;</span>
<span style="color: red;">КонецЦикла</span><span style="color: red;">;</span>
ТекстЗапроса <span style="color: red;">=</span> ТекстЗапроса <span style="color: red;">+</span> <span style="color: black;">"</span>
<span style="color: black;">|, NOUNLOAD, REPLACE, STATS = 5"</span><span style="color: red;">;</span>
СоединениеSQL<span style="color: red;">.</span>CommandText <span style="color: red;">=</span> ТекстЗапроса<span style="color: red;">;</span>
СоединениеSQL<span style="color: red;">.</span><span style="color: red;">Execute</span><span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
<span style="color: red;">Функция</span> ПолучитьФайлыБазы<span style="color: red;">(</span>СоединениеSQL<span style="color: red;">,</span> БазаSQL<span style="color: red;">)</span> <span style="color: red;">Экспорт</span>
<span style="color: red;">Перем</span> Результат<span style="color: red;">;</span>
ТекстЗапроса <span style="color: red;">=</span>
<span style="color: black;">"SELECT [file_id]</span>
<span style="color: black;">|,[type_desc]</span>
<span style="color: black;">|,[name]</span>
<span style="color: black;">|,[physical_name]</span>
<span style="color: black;">|FROM ["</span> <span style="color: red;">+</span> БазаSQL <span style="color: red;">+</span> <span style="color: black;">"].[sys].[database_files]"</span><span style="color: red;">;</span>
СоединениеSQL<span style="color: red;">.</span>CommandText <span style="color: red;">=</span> ТекстЗапроса<span style="color: red;">;</span>
Результат <span style="color: red;">=</span> <span style="color: red;">Новый</span> Массив<span style="color: red;">;</span>
RecordSet <span style="color: red;">=</span> СоединениеSQL<span style="color: red;">.</span><span style="color: red;">Execute</span><span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
RecordSet<span style="color: red;">.</span>MoveFirst<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">Пока</span> <span style="color: red;">НЕ</span> RecordSet<span style="color: red;">.</span>EOF <span style="color: red;">Цикл</span>
Fields <span style="color: red;">=</span> RecordSet<span style="color: red;">.</span>Fields<span style="color: red;">;</span>
СтруктураФайла <span style="color: red;">=</span> <span style="color: red;">Новый</span> Структура<span style="color: red;">(</span><span style="color: black;">"name, type_desc"</span><span style="color: red;">,</span> Fields<span style="color: red;">[</span><span style="color: black;">"name"</span><span style="color: red;">]</span><span style="color: red;">.</span>Value<span style="color: red;">,</span> Fields<span style="color: red;">[</span><span style="color: black;">"type_desc"</span><span style="color: red;">]</span><span style="color: red;">.</span>Value<span style="color: red;">)</span><span style="color: red;">;</span>
Результат<span style="color: red;">.</span>Добавить<span style="color: red;">(</span>СтруктураФайла<span style="color: red;">)</span><span style="color: red;">;</span>
RecordSet<span style="color: red;">.</span>MoveNext<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецЦикла</span><span style="color: red;">;</span>
<span style="color: red;">Возврат</span> Результат<span style="color: red;">;</span>
<span style="color: red;">КонецФункции</span>
</code></pre>
<br />
Вкалывают роботы, счастлив человек :)<br />
<br />
<br /></div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com0tag:blogger.com,1999:blog-7763816944206062403.post-69055800478452796652016-05-01T03:45:00.000+03:002016-05-01T03:45:36.970+03:00Состояние обновления базы<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3DEaaToQkDwGlHdtE9D0mhu9In5tU_DX-syWyAjiOZqAudBumkgkgWl4GG3pOki2iB0705uYSPoOKApwtwDBnbJwpkTNSOMGI-z54lxBjUyDuFj_-ys0tiT3dEJF-c4UixlxE7MhwPekR/s1600/images.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3DEaaToQkDwGlHdtE9D0mhu9In5tU_DX-syWyAjiOZqAudBumkgkgWl4GG3pOki2iB0705uYSPoOKApwtwDBnbJwpkTNSOMGI-z54lxBjUyDuFj_-ys0tiT3dEJF-c4UixlxE7MhwPekR/s400/images.png" /></a></div>
Всем привет. С тех пор, как пошли проекты на 1С: ERP, времени на блог совсем не осталось. Поэтому просто поделюсь своей обработкой мониторинга состояния обновления. Но сначала немного о механизме обновления 1С: ERP.<br />
<br />
Начиная с релиза 2.1.2 необходимые для обработки данные регистрируются в плане обмена ОбновлениеИнформационнойБазы. Если верить статье <a href="https://habrahabr.ru/company/1c/blog/280394/" target="_blank">Как разрабатывается 1С:ERP</a>, то такой же механизм будет использоваться в новых Управлении Торговлей и Комплексной Автоматизации. Кстати, там же можно найти и ответ по поводу "странных" комментариев в коде ERP: УТКА / НЕ УТКА :)<br />
<a name='more'></a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-MczAzDUH2lG1trUvZxxW4hbAsF7m-040Cf1n43TlpqVMCbM8DJ5Qr2gey2j3GvdA9jXE6GlqNcMNu9fW0wUmSWZmdo7bM0r8Ve_LUdkgV9TFxZyeVyq7-4u7HTeaqT41vuMvX84Pl_Z_/s1600/00003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-MczAzDUH2lG1trUvZxxW4hbAsF7m-040Cf1n43TlpqVMCbM8DJ5Qr2gey2j3GvdA9jXE6GlqNcMNu9fW0wUmSWZmdo7bM0r8Ve_LUdkgV9TFxZyeVyq7-4u7HTeaqT41vuMvX84Pl_Z_/s1600/00003.png" /></a></div>
<br />
Процесс регистрации блокирует базу и может действительно занимать длительное время. По началу даже подумал, что клиент завис на 100%, но через три часа (!!!) процесс обновления перешел к следующей стадии. При малых значениях времени засыпания и завершения сеансов в параметрах ИБ (Конфигуратор - Администрирование - Параметры информационной базы) есть шанс словить закрытие клиента. Поэтому на время регистрации объектов стоит выставить значения побольше.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1OwXApBz-qrL1AJTBVM5gjPm6BYKrN45kkmhLRBiuZig9N_U09jMETvx3wn0DdxTjhyOPIM4lLVvBtJ7Rf-y-ciyNQA8M7Nn8_h0QwfEY1HkDxmXIqodubkjRF87dor8X8HDqbr6-7R-1/s1600/00001.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1OwXApBz-qrL1AJTBVM5gjPm6BYKrN45kkmhLRBiuZig9N_U09jMETvx3wn0DdxTjhyOPIM4lLVvBtJ7Rf-y-ciyNQA8M7Nn8_h0QwfEY1HkDxmXIqodubkjRF87dor8X8HDqbr6-7R-1/s1600/00001.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Размер базы примерно 100 Гб, переход с 2.0.10.199 на 2.1.2.117</td></tr>
</tbody></table>
Далее, после подготовки, база переключается в многопользовательский режим, обработчики обрабатывают свои данные порциями по пятьсот объектов. Настройки приоритета влияют только на то, будут ли обработчики запускаться по расписанию или один за другим.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG9FqgSnmiPrOpJaE9Lt5NXlWLbJeo6bVNaFeOXdW3VT4bp2bk5sQmAcJw20vyX8orA795oFal4Pa5hyVJG8P2XOGUFRQ-ozYZa3Z3ZyNk2wvZ9NpL8hZrVUII7KV8MGG0cE_sRJl6nmyp/s1600/00004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="402" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG9FqgSnmiPrOpJaE9Lt5NXlWLbJeo6bVNaFeOXdW3VT4bp2bk5sQmAcJw20vyX8orA795oFal4Pa5hyVJG8P2XOGUFRQ-ozYZa3Z3ZyNk2wvZ9NpL8hZrVUII7KV8MGG0cE_sRJl6nmyp/s640/00004.png" width="640" /></a></div>
<br />
К сожалению, типовой функционал не дает возможности оценить примерное оставшееся время и объем данных к обработке. Поэтому решил набросать свой монитор состояния обновления базы. Читает данные раз в минуту, дает прогноз по оставшемуся времени, показывает количество данных к обработке, последние обработанные данные, среднюю и текущую скорость обработки данных. Ссылка в конце страницы, идеи принимаются :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzWulj6v1w_u_6NEGh7-METXb2D2bCW1WDaxG3wZ8kTqwr4r6LHSnMNC5CJIqw91ZhslO2AT-x-cTZJLCwJxE1wdGTCA8vmFzCabAB-ndzcAy9omTkImUQO7uOkNLQxuXqNYqilwd1T1a8/s1600/00002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="346" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzWulj6v1w_u_6NEGh7-METXb2D2bCW1WDaxG3wZ8kTqwr4r6LHSnMNC5CJIqw91ZhslO2AT-x-cTZJLCwJxE1wdGTCA8vmFzCabAB-ndzcAy9omTkImUQO7uOkNLQxuXqNYqilwd1T1a8/s640/00002.png" width="640" /></a></div>
<br />
<br />
<pre style="color: blue;"><code class="_1c8">
<span style="color: brown;">&НаСервере</span>
<span style="color: red;">Процедура</span> ПриСозданииНаСервере<span style="color: red;">(</span>Отказ<span style="color: red;">,</span> СтандартнаяОбработка<span style="color: red;">)</span>
ПолучитьДанныеРегистрацийНаСервере<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
КоличествоЭлементовНачало <span style="color: red;">=</span> СоставОбмена<span style="color: red;">.</span>Итог<span style="color: red;">(</span><span style="color: black;">"КоличествоЭлементов"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ВремяЗамера <span style="color: red;">=</span> ТекущаяУниверсальнаяДатаВМиллисекундах<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПоследнееВремяЗамера <span style="color: red;">=</span> ВремяЗамера<span style="color: red;">;</span>
Элементы<span style="color: red;">.</span>Счетчик<span style="color: red;">.</span>МаксимальноеЗначение <span style="color: red;">=</span> КоличествоЭлементовНачало<span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
<span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Процедура</span> ПриОткрытии<span style="color: red;">(</span>Отказ<span style="color: red;">)</span>
ПодключитьОбработчикОжидания<span style="color: red;">(</span><span style="color: black;">"ПолучитьДанныеРегистраций"</span><span style="color: red;">,</span> <span style="color: black;">60</span><span style="color: red;">,</span> <span style="color: red;">Истина</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
<span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Процедура</span> КомандаОбновить<span style="color: red;">(</span>Команда<span style="color: red;">)</span>
ПолучитьДанныеРегистраций<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span>
<span style="color: brown;">&НаКлиенте</span>
<span style="color: red;">Процедура</span> ПолучитьДанныеРегистраций<span style="color: red;">(</span><span style="color: red;">)</span>
ОтключитьОбработчикОжидания<span style="color: red;">(</span><span style="color: black;">"ПолучитьДанныеРегистраций"</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПолучитьДанныеРегистрацийНаСервере<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
ПодключитьОбработчикОжидания<span style="color: red;">(</span><span style="color: black;">"ПолучитьДанныеРегистраций"</span><span style="color: red;">,</span> <span style="color: black;">60</span><span style="color: red;">,</span> <span style="color: red;">Истина</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span> <span style="color: green;">// ПолучитьДанныеРегистраций()</span>
<span style="color: brown;">&НаСервере</span>
<span style="color: red;">Процедура</span> ПолучитьДанныеРегистрацийНаСервере<span style="color: red;">(</span><span style="color: red;">)</span>
Запрос <span style="color: red;">=</span> <span style="color: red;">Новый</span> Запрос<span style="color: red;">;</span>
СформироватьТекстЗапроса<span style="color: red;">(</span>Запрос<span style="color: red;">)</span><span style="color: red;">;</span>
Запрос<span style="color: red;">.</span>УстановитьПараметр<span style="color: red;">(</span><span style="color: black;">"СоставОбмена"</span><span style="color: red;">,</span> СоставОбмена<span style="color: red;">.</span>Выгрузить<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">)</span><span style="color: red;">;</span>
КоличествоЭлементовБыло <span style="color: red;">=</span> СоставОбмена<span style="color: red;">.</span>Итог<span style="color: red;">(</span><span style="color: black;">"КоличествоЭлементов"</span><span style="color: red;">)</span><span style="color: red;">;</span>
СоставОбмена<span style="color: red;">.</span>Загрузить<span style="color: red;">(</span>Запрос<span style="color: red;">.</span><span style="color: red;">Выполнить</span><span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">.</span>Выгрузить<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">)</span><span style="color: red;">;</span>
СоставОбмена<span style="color: red;">.</span>Сортировать<span style="color: red;">(</span><span style="color: black;">"ОбъектМетаданных"</span><span style="color: red;">)</span><span style="color: red;">;</span>
КоличествоЭлементов <span style="color: red;">=</span> СоставОбмена<span style="color: red;">.</span>Итог<span style="color: red;">(</span><span style="color: black;">"КоличествоЭлементов"</span><span style="color: red;">)</span><span style="color: red;">;</span>
Дельта <span style="color: red;">=</span> <span style="color: red;">?</span><span style="color: red;">(</span>КоличествоЭлементовБыло<span style="color: red;">,</span> КоличествоЭлементовБыло <span style="color: red;">-</span> КоличествоЭлементов<span style="color: red;">,</span> <span style="color: black;">0</span><span style="color: red;">)</span><span style="color: red;">;</span>
ТекущееВремяЗамера <span style="color: red;">=</span> ТекущаяУниверсальнаяДатаВМиллисекундах<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
ДельтаВремя <span style="color: red;">=</span> <span style="color: red;">?</span><span style="color: red;">(</span>ВремяЗамера<span style="color: red;">,</span> ТекущееВремяЗамера <span style="color: red;">-</span> ВремяЗамера<span style="color: red;">,</span> <span style="color: black;">0</span><span style="color: red;">)</span><span style="color: red;">;</span>
Счетчик <span style="color: red;">=</span> Счетчик <span style="color: red;">+</span> Дельта<span style="color: red;">;</span>
ТекущаяСкоростьОбработки <span style="color: red;">=</span> Дельта <span style="color: red;">/</span> <span style="color: red;">(</span>ТекущееВремяЗамера <span style="color: red;">-</span> ПоследнееВремяЗамера<span style="color: red;">)</span> <span style="color: red;">*</span> <span style="color: black;">1000</span><span style="color: red;">;</span>
СкоростьОбработки <span style="color: red;">=</span> <span style="color: red;">?</span><span style="color: red;">(</span>ДельтаВремя<span style="color: red;">,</span> Счетчик <span style="color: red;">/</span> ДельтаВремя <span style="color: red;">*</span> <span style="color: black;">1000</span><span style="color: red;">,</span> <span style="color: black;">0</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">Если</span> ДельтаВремя <span style="color: red;">Тогда</span>
ОставшеесяВремяСекунд <span style="color: red;">=</span> Цел<span style="color: red;">(</span>КоличествоЭлементов <span style="color: red;">/</span> СкоростьОбработки<span style="color: red;">)</span><span style="color: red;">;</span>
ОсталосьЧасов <span style="color: red;">=</span> Цел<span style="color: red;">(</span>ОставшеесяВремяСекунд <span style="color: red;">/</span> <span style="color: black;">3600</span><span style="color: red;">)</span><span style="color: red;">;</span>
ОстатокСекунд <span style="color: red;">=</span> ОставшеесяВремяСекунд <span style="color: red;">%</span> <span style="color: black;">3600</span><span style="color: red;">;</span>
ОсталосьМинут <span style="color: red;">=</span> Цел<span style="color: red;">(</span>ОстатокСекунд <span style="color: red;">/</span> <span style="color: black;">60</span><span style="color: red;">)</span><span style="color: red;">;</span>
ОсталосьСекунд <span style="color: red;">=</span> ОстатокСекунд <span style="color: red;">%</span> <span style="color: black;">60</span><span style="color: red;">;</span>
ОставшеесяВремя <span style="color: red;">=</span> Формат<span style="color: red;">(</span>ОсталосьЧасов<span style="color: red;">,</span> <span style="color: black;">"ЧГ=0"</span><span style="color: red;">)</span> <span style="color: red;">+</span> <span style="color: black;">":"</span> <span style="color: red;">+</span> Формат<span style="color: red;">(</span>ОсталосьМинут<span style="color: red;">,</span> <span style="color: black;">"ЧЦ=2; ЧВН="</span><span style="color: red;">)</span> <span style="color: red;">+</span> <span style="color: black;">":"</span> <span style="color: red;">+</span> Формат<span style="color: red;">(</span>ОсталосьСекунд<span style="color: red;">,</span> <span style="color: black;">"ЧЦ=2; ЧВН="</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецЕсли</span><span style="color: red;">;</span>
ПоследнееВремяЗамера <span style="color: red;">=</span> ТекущееВремяЗамера<span style="color: red;">;</span>
<span style="color: red;">КонецПроцедуры</span> <span style="color: green;">// ПолучитьДанныеРегистраций()</span>
<span style="color: brown;">&НаСервере</span>
<span style="color: red;">Функция</span> СформироватьТекстЗапроса<span style="color: red;">(</span>Запрос<span style="color: red;">)</span>
Запрос<span style="color: red;">.</span>Текст <span style="color: red;">=</span>
<span style="color: black;">"ВЫБРАТЬ</span>
<span style="color: black;">| СоставОбмена.ОбъектМетаданных,</span>
<span style="color: black;">| СоставОбмена.Представление,</span>
<span style="color: black;">| СоставОбмена.КоличествоЭлементов</span>
<span style="color: black;">|ПОМЕСТИТЬ СоставОбмена</span>
<span style="color: black;">|ИЗ</span>
<span style="color: black;">| &СоставОбмена КАК СоставОбмена</span>
<span style="color: black;">|;</span>
<span style="color: black;">|</span>
<span style="color: black;">|////////////////////////////////////////////////////////////////////////////////</span>
<span style="color: black;">|"</span> <span style="color: red;">+</span> ПолучитьТекстЗапросаКоличестваЭлементов<span style="color: red;">(</span>Запрос<span style="color: red;">)</span> <span style="color: red;">+</span> <span style="color: black;">"</span>
<span style="color: black;">|;</span>
<span style="color: black;">|</span>
<span style="color: black;">|////////////////////////////////////////////////////////////////////////////////</span>
<span style="color: black;">|ВЫБРАТЬ</span>
<span style="color: black;">| ЕСТЬNULL(СоставОбмена.ОбъектМетаданных, НовыйСоставОбмена.ОбъектМетаданных) КАК ОбъектМетаданных,</span>
<span style="color: black;">| ЕСТЬNULL(СоставОбмена.Представление, НовыйСоставОбмена.Представление) КАК Представление,</span>
<span style="color: black;">| ЕСТЬNULL(СоставОбмена.КоличествоЭлементов, 0) КАК КоличествоЭлементовБыло,</span>
<span style="color: black;">| ЕСТЬNULL(НовыйСоставОбмена.КоличествоЭлементов, 0) КАК КоличествоЭлементов</span>
<span style="color: black;">|ИЗ</span>
<span style="color: black;">| СоставОбмена КАК СоставОбмена</span>
<span style="color: black;">| ПОЛНОЕ СОЕДИНЕНИЕ НовыйСоставОбмена КАК НовыйСоставОбмена</span>
<span style="color: black;">| ПО СоставОбмена.ОбъектМетаданных ПОДОБНО НовыйСоставОбмена.ОбъектМетаданных</span>
<span style="color: black;">|ГДЕ</span>
<span style="color: black;">| (ЕСТЬNULL(СоставОбмена.КоличествоЭлементов, 0) > 0</span>
<span style="color: black;">| ИЛИ ЕСТЬNULL(НовыйСоставОбмена.КоличествоЭлементов, 0) > 0)"</span><span style="color: red;">;</span>
<span style="color: red;">КонецФункции</span> <span style="color: green;">// СформироватьТекстЗапроса()</span>
<span style="color: brown;">&НаСервере</span>
<span style="color: red;">Функция</span> ПолучитьТекстЗапросаКоличестваЭлементов<span style="color: red;">(</span>Запрос<span style="color: red;">)</span>
ЗапросТекст <span style="color: red;">=</span> <span style="color: black;">""</span><span style="color: red;">;</span>
ИндексЗапроса <span style="color: red;">=</span> <span style="color: black;">0</span><span style="color: red;">;</span>
СоставОбновления <span style="color: red;">=</span> Метаданные<span style="color: red;">.</span>ПланыОбмена<span style="color: red;">.</span>ОбновлениеИнформационнойБазы<span style="color: red;">.</span>Состав<span style="color: red;">;</span>
<span style="color: red;">Для</span> <span style="color: red;">Каждого</span> ЭлементСостава <span style="color: red;">Из</span> СоставОбновления <span style="color: red;">Цикл</span>
ОбъектМетаданных <span style="color: red;">=</span> ЭлементСостава<span style="color: red;">.</span>Метаданные<span style="color: red;">.</span>ПолноеИмя<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
Представление <span style="color: red;">=</span> ЭлементСостава<span style="color: red;">.</span>Метаданные<span style="color: red;">.</span>Представление<span style="color: red;">(</span><span style="color: red;">)</span><span style="color: red;">;</span>
ИндексСтрока <span style="color: red;">=</span> XMLСтрока<span style="color: red;">(</span>ИндексЗапроса<span style="color: red;">)</span><span style="color: red;">;</span>
Запрос<span style="color: red;">.</span>УстановитьПараметр<span style="color: red;">(</span><span style="color: black;">"ОбъектМетаданных"</span> <span style="color: red;">+</span> ИндексСтрока<span style="color: red;">,</span> ОбъектМетаданных<span style="color: red;">)</span><span style="color: red;">;</span>
Запрос<span style="color: red;">.</span>УстановитьПараметр<span style="color: red;">(</span><span style="color: black;">"Представление"</span> <span style="color: red;">+</span> ИндексСтрока<span style="color: red;">,</span> Представление<span style="color: red;">)</span><span style="color: red;">;</span>
ЗапросТекст <span style="color: red;">=</span> ЗапросТекст <span style="color: red;">+</span> ПолучитьТекстЗапросаКоличества<span style="color: red;">(</span>ОбъектМетаданных<span style="color: red;">,</span> ИндексЗапроса<span style="color: red;">)</span><span style="color: red;">;</span>
ИндексЗапроса <span style="color: red;">=</span> ИндексЗапроса <span style="color: red;">+</span> <span style="color: black;">1</span><span style="color: red;">;</span>
<span style="color: red;">КонецЦикла</span><span style="color: red;">;</span>
<span style="color: red;">Возврат</span> ЗапросТекст<span style="color: red;">;</span>
<span style="color: red;">КонецФункции</span> <span style="color: green;">// ПолучитьТекстЗапросаКоличестваЭлементов()</span>
<span style="color: brown;">&НаСервере</span>
<span style="color: red;">Функция</span> ПолучитьТекстЗапросаКоличества<span style="color: red;">(</span>ОбъектМетаданных<span style="color: red;">,</span> ИндексЗапроса<span style="color: red;">)</span>
<span style="color: red;">Возврат</span> <span style="color: red;">?</span><span style="color: red;">(</span>ИндексЗапроса<span style="color: red;">,</span> <span style="color: black;">"</span>
<span style="color: black;">|</span>
<span style="color: black;">|ОБЪЕДИНИТЬ ВСЕ</span>
<span style="color: black;">|"</span><span style="color: red;">,</span> <span style="color: black;">""</span><span style="color: red;">)</span> <span style="color: red;">+</span> СтрЗаменить<span style="color: red;">(</span>
<span style="color: black;">"ВЫБРАТЬ</span>
<span style="color: black;">| &ОбъектМетаданных"</span> <span style="color: red;">+</span> XMLСтрока<span style="color: red;">(</span>ИндексЗапроса<span style="color: red;">)</span> <span style="color: red;">+</span> <span style="color: black;">" КАК ОбъектМетаданных,</span>
<span style="color: black;">| &Представление"</span> <span style="color: red;">+</span> XMLСтрока<span style="color: red;">(</span>ИндексЗапроса<span style="color: red;">)</span> <span style="color: red;">+</span> <span style="color: black;">" КАК Представление,</span>
<span style="color: black;">| КОЛИЧЕСТВО(ТаблицаИзменений.Узел) КАК КоличествоЭлементов"</span> <span style="color: red;">+</span> <span style="color: red;">?</span><span style="color: red;">(</span>ИндексЗапроса<span style="color: red;">,</span> <span style="color: black;">""</span><span style="color: red;">,</span> <span style="color: black;">" </span>
<span style="color: black;">|ПОМЕСТИТЬ НовыйСоставОбмена"</span><span style="color: red;">)</span> <span style="color: red;">+</span> <span style="color: black;">" </span>
<span style="color: black;">|ИЗ</span>
<span style="color: black;">| #ТаблицаИзменений КАК ТаблицаИзменений</span>
<span style="color: black;">|ГДЕ</span>
<span style="color: black;">| ТаблицаИзменений.Узел ССЫЛКА ПланОбмена.ОбновлениеИнформационнойБазы"</span><span style="color: red;">,</span> <span style="color: black;">"#ТаблицаИзменений"</span><span style="color: red;">,</span> ОбъектМетаданных <span style="color: red;">+</span> <span style="color: black;">".Изменения"</span><span style="color: red;">)</span><span style="color: red;">;</span>
<span style="color: red;">КонецФункции</span> <span style="color: green;">// ПолучитьКоличествоРегистраций()</span>
</code></pre>
<br />
<a href="https://drive.google.com/file/d/0B6vvASpBDRi-Mk54dUxDTXNodmc/view?usp=sharing" target="_blank">Обработка "Состояние обновления базы", 10 КБ</a><br />
<br />
<br /></div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com2tag:blogger.com,1999:blog-7763816944206062403.post-19780895466432301092016-02-28T22:59:00.000+03:002016-02-28T22:59:27.237+03:00А ты включил режим "high perfomance"?<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKjinHHKz9_WEau39Gs2WwjT1icQ6RmLR0dCEGnxXqn8SjqQsFovfOTO0FdyDSgMLcJ2MvIWb93yHuyG93ET_HkHSZinTdkX_KFA0WQeFGo-YB-PWUUf9hciLBf5MlI3PkzyKDQLLVtm0p/s1600/images.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKjinHHKz9_WEau39Gs2WwjT1icQ6RmLR0dCEGnxXqn8SjqQsFovfOTO0FdyDSgMLcJ2MvIWb93yHuyG93ET_HkHSZinTdkX_KFA0WQeFGo-YB-PWUUf9hciLBf5MlI3PkzyKDQLLVtm0p/s400/images.png" /></a>Нашел на днях свой прошлогодний отчет для клиента о произведенных настройках сервера. Обратились с проблемой: после перехода с файловой типовой бухгалтерии (до десяти пользователей одновременно) на клиент-сервер начались тормоза. В частности, время восстановления последовательности увеличилось раз в пять. За что, спрашивается, заплатили?<br />
Отдельно стоит выделить настройку управления питанием сервера. Делается просто, но как ни странно, про нее часто забывают. Все последние сервера, которые приходилось дополнительно настраивать, работали со схемой "по умолчанию". Поэтому выкладываю результаты замеров производительности из этого отчета, как аргумент в пользу того, что не стоит пренебрегать данной настройкой.<br />
<a name='more'></a><br />
Восстановление последовательности за квартал занимало в среднем 860 секунд. После переключения в режим "высокой производительности" время выполнения операции снизилось до 290 секунд. Ускорение практически в три раза одним нажатием.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP2t2FBiIWgoRC3ZblWEcc0SyBJ6zls3yca1ozRvhUuWF9Jv5t2LejdLBmMztrsL6CjInSAMYyb321CSvNnzUDEFrTL_YD8ieNommclDZsAfpHWaN1Xd7MBUcr-pNQzLH_ZkRmA-MlSJsF/s1600/001.png" imageanchor="1"><img border="0" height="251" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP2t2FBiIWgoRC3ZblWEcc0SyBJ6zls3yca1ozRvhUuWF9Jv5t2LejdLBmMztrsL6CjInSAMYyb321CSvNnzUDEFrTL_YD8ieNommclDZsAfpHWaN1Xd7MBUcr-pNQzLH_ZkRmA-MlSJsF/s640/001.png" width="640" /></a><br />
Результаты замеров счетчиков монитора производительности (perfmon):<br />
<br />
1. Нагрузочный тест Гилева, сбалансированная схема.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8jadosnjDPttFhzUysGTmmsJlcOH41Y71jxspcFkfMlioWt3hPq0_Z1_0dkqs_spHSH4o_a440BqudaA2ZR3JGUhWMCIOcIl0Cky9GtevbKalpGJvPF9YpijoawL5_ULa_KQjjWr5N27L/s1600/003.png" imageanchor="1"><img border="0" height="306" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8jadosnjDPttFhzUysGTmmsJlcOH41Y71jxspcFkfMlioWt3hPq0_Z1_0dkqs_spHSH4o_a440BqudaA2ZR3JGUhWMCIOcIl0Cky9GtevbKalpGJvPF9YpijoawL5_ULa_KQjjWr5N27L/s640/003.png" width="640" /></a><br />
<br />
2. Нагрузочный тест Гилева, схема "Высокая производительность".<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjR-291bKXkYRRrYnlGNC6j9bV6UqYvzjKmJyvWLzcwRjW3cfBEaOFjbvjn1AXqoC6KpcwNWjfuydAEb4Zwztugy-NyPGSwVje6mCjK0uT8k6GbrzF-qD16PpyN_FdJPuC4XE2Fn85UmokV/s1600/004.png" imageanchor="1"><img border="0" height="305" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjR-291bKXkYRRrYnlGNC6j9bV6UqYvzjKmJyvWLzcwRjW3cfBEaOFjbvjn1AXqoC6KpcwNWjfuydAEb4Zwztugy-NyPGSwVje6mCjK0uT8k6GbrzF-qD16PpyN_FdJPuC4XE2Fn85UmokV/s640/004.png" width="640" /></a><br />
<br />
3. Восстановление последовательности, сбалансированная схема.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwW7AgA8GNqIquXV0lFuoWg833Gc3EWKgp1YiCiZ9BrAb7_70VwgeAMRPgETxHpHQksPvI4WNOBSyHahE_x1Ce2HvUM41Ka1CBVBke6NN7gUwslaSZiAHMPhRCiqeR-XVV3ysaCzn0hq3X/s1600/005.png" imageanchor="1"><img border="0" height="307" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwW7AgA8GNqIquXV0lFuoWg833Gc3EWKgp1YiCiZ9BrAb7_70VwgeAMRPgETxHpHQksPvI4WNOBSyHahE_x1Ce2HvUM41Ka1CBVBke6NN7gUwslaSZiAHMPhRCiqeR-XVV3ysaCzn0hq3X/s640/005.png" width="640" /></a><br />
<br />
4. Восстановление последовательности, схема "Высокая производительность".<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwehDL8X8rPYRbcKNPdJtTAJK-uHiq5vIVPo4bNlCPk87G73cNXkHQDcNahgvQPmqoko7lHVIekTfhjhcZjiWOMQSB22vDvZ_e2H9JcNE5stPvQjQ1ghlCyCi10hgnlpj5umshHTaeQsP7/s1600/006.png" imageanchor="1"><img border="0" height="305" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwehDL8X8rPYRbcKNPdJtTAJK-uHiq5vIVPo4bNlCPk87G73cNXkHQDcNahgvQPmqoko7lHVIekTfhjhcZjiWOMQSB22vDvZ_e2H9JcNE5stPvQjQ1ghlCyCi10hgnlpj5umshHTaeQsP7/s640/006.png" width="640" /></a><br />
<br />
По результатам замеров можно увидеть, что при включении режима "высокой производительности" количество дисковых операций чтения/записи в единицу времени возрастает. Что в свою очередь сказывается на общем времени выполнения операций.<br />
<br />
<br /></div>
mickey.1cxhttp://www.blogger.com/profile/09378089754067271280noreply@blogger.com7