├── .gitignore ├── .dockerignore ├── docs ├── index.md ├── std │ ├── 669.alert1.png │ ├── 669.alert2.png │ ├── 669.alert3.png │ ├── 669.alert4.png │ ├── 488.md │ ├── 543.md │ ├── 483.md │ ├── 585.md │ ├── 400.md │ ├── 499.md │ ├── 644.md │ ├── 774.md │ ├── 484.md │ ├── 485.md │ ├── 553.md │ ├── 770.md │ ├── 641.md │ ├── 775.md │ ├── 551.md │ ├── 727.md │ ├── 547.md │ ├── 438.md │ ├── 454.md │ ├── 794.md │ ├── 686.md │ ├── 791.md │ ├── 678.md │ ├── 467.md │ ├── 647.md │ ├── 726.md │ ├── 456.md │ ├── 643.md │ ├── 640.md │ ├── 669.md │ ├── 783.md │ └── 455.md ├── assets │ ├── images │ │ ├── logo.png │ │ └── illustration.png │ └── stylesheets │ │ └── extra.css ├── diagnostics │ └── bslls │ │ └── YoLetterUsage.md └── support.md ├── README.md ├── docker └── dockerfile ├── nginx └── default.conf ├── docker-compose.yml ├── docker-compose.ngnix.yml ├── overrides ├── main.html └── home.html ├── .github └── workflows │ └── ci.yml ├── mkdocs.yml └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode/ 2 | site/ 3 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .github/ 2 | .vscode/ 3 | docker/ 4 | site/ 5 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | template: home.html 3 | title: Главная 4 | --- 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Стандарты разработки 1С от Ингвара 2 | https://v8std.ru 3 | 4 | -------------------------------------------------------------------------------- /docker/dockerfile: -------------------------------------------------------------------------------- 1 | FROM squidfunk/mkdocs-material:latest 2 | 3 | RUN pip install pygments-bsl 4 | -------------------------------------------------------------------------------- /docs/std/669.alert1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeegin/v8std/HEAD/docs/std/669.alert1.png -------------------------------------------------------------------------------- /docs/std/669.alert2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeegin/v8std/HEAD/docs/std/669.alert2.png -------------------------------------------------------------------------------- /docs/std/669.alert3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeegin/v8std/HEAD/docs/std/669.alert3.png -------------------------------------------------------------------------------- /docs/std/669.alert4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeegin/v8std/HEAD/docs/std/669.alert4.png -------------------------------------------------------------------------------- /docs/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeegin/v8std/HEAD/docs/assets/images/logo.png -------------------------------------------------------------------------------- /docs/assets/images/illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeegin/v8std/HEAD/docs/assets/images/illustration.png -------------------------------------------------------------------------------- /docs/std/488.md: -------------------------------------------------------------------------------- 1 | ###### #std488 2 | 3 | # Стандартные роли 4 | 5 | 8 | 9 | ###### Источник 10 | 11 | https://its.1c.ru/db/v8std#content:488 -------------------------------------------------------------------------------- /docs/std/543.md: -------------------------------------------------------------------------------- 1 | ###### #std543 2 | 3 | # Использование подсистем 4 | 5 | 8 | 9 | ###### Источник 10 | 11 | https://its.1c.ru/db/v8std#content:543 -------------------------------------------------------------------------------- /docs/std/483.md: -------------------------------------------------------------------------------- 1 | ###### #std483 2 | 3 | # Нумерация редакций и версий 4 | 5 | 8 | 9 | ###### Источник 10 | 11 | https://its.1c.ru/db/v8std#content:483 -------------------------------------------------------------------------------- /docs/std/585.md: -------------------------------------------------------------------------------- 1 | ###### #std585 2 | 3 | # Сообщения пользователю 4 | 5 | 8 | 9 | ###### Источник 10 | 11 | https://its.1c.ru/db/v8std#content:585 12 | -------------------------------------------------------------------------------- /docs/std/400.md: -------------------------------------------------------------------------------- 1 | ###### #std400 2 | 3 | # Информирование пользователя 4 | 5 | 8 | 9 | ###### Источник 10 | 11 | https://its.1c.ru/db/v8std#content:400 12 | -------------------------------------------------------------------------------- /docs/std/499.md: -------------------------------------------------------------------------------- 1 | ###### #std499 2 | 3 | # Перехват исключений в коде 4 | 5 | 8 | 9 | ###### Источник 10 | 11 | https://its.1c.ru/db/v8std#content:499 12 | -------------------------------------------------------------------------------- /docs/std/644.md: -------------------------------------------------------------------------------- 1 | ###### #std644 2 | 3 | # Обеспечение совместимости библиотек 4 | 5 | 8 | 9 | ###### Источник 10 | 11 | https://its.1c.ru/db/v8std#content:644 -------------------------------------------------------------------------------- /docs/std/774.md: -------------------------------------------------------------------------------- 1 | ###### #std774 2 | 3 | # Безопасность запуска приложений 4 | 5 | 8 | 9 | ###### Источник 10 | 11 | https://its.1c.ru/db/v8std#content:774 -------------------------------------------------------------------------------- /nginx/default.conf: -------------------------------------------------------------------------------- 1 | 2 | server { 3 | listen 8080; 4 | server_name localhost; 5 | 6 | location / { 7 | root /usr/share/nginx/html; 8 | index index.html; 9 | } 10 | 11 | error_page 404 /404.html; 12 | } 13 | -------------------------------------------------------------------------------- /docs/std/484.md: -------------------------------------------------------------------------------- 1 | ###### #std484 2 | 3 | # Общие сведения о выпуске конфигураций 4 | 5 | 8 | 9 | ###### Источник 10 | 11 | https://its.1c.ru/db/v8std#content:484 -------------------------------------------------------------------------------- /docs/std/485.md: -------------------------------------------------------------------------------- 1 | ###### #std485 2 | 3 | # Использование привилегированного режима 4 | 5 | 8 | 9 | ###### Источник 10 | 11 | https://its.1c.ru/db/v8std#content:485 -------------------------------------------------------------------------------- /docs/std/553.md: -------------------------------------------------------------------------------- 1 | ###### #std553 2 | 3 | # Переопределяемые и поставляемые объекты библиотеки 4 | 5 | 8 | 9 | ###### Источник 10 | 11 | https://its.1c.ru/db/v8std#content:553 -------------------------------------------------------------------------------- /docs/std/770.md: -------------------------------------------------------------------------------- 1 | ###### #std770 2 | 3 | # Ограничения на использование Выполнить и Вычислить на сервере 4 | 5 | 8 | 9 | ###### Источник 10 | 11 | https://its.1c.ru/db/v8std#content:770 -------------------------------------------------------------------------------- /docs/diagnostics/bslls/YoLetterUsage.md: -------------------------------------------------------------------------------- 1 | ###### BSLLS:YoLetterUsage 2 | 3 | # Использование буквы "ё" в текстах модулей (YoLetterUsage) 4 | 5 | - Дефект кода 6 | - Информационный 7 | 8 | ###### Источник 9 | 10 | https://1c-syntax.github.io/bsl-language-server/diagnostics/YoLetterUsage/ -------------------------------------------------------------------------------- /docs/std/641.md: -------------------------------------------------------------------------------- 1 | ###### #std641 2 | 3 | # Структуры и таблицы значений в качестве параметров процедур и функций 4 | 5 | 8 | 9 | ###### Источник 10 | 11 | https://its.1c.ru/db/v8std#content:641 -------------------------------------------------------------------------------- /docs/std/775.md: -------------------------------------------------------------------------------- 1 | ###### #std775 2 | 3 | # Безопасность программного обеспечения, вызываемого через открытые интерфейсы 4 | 5 | 8 | 9 | ###### Источник 10 | 11 | https://its.1c.ru/db/v8std#content:775 -------------------------------------------------------------------------------- /docs/std/551.md: -------------------------------------------------------------------------------- 1 | ###### #std551 2 | 3 | # Разработка конфигураций с повторным использованием общего кода и объектов метаданных 4 | 5 | 8 | 9 | ###### Источник 10 | 11 | https://its.1c.ru/db/v8std#content:551 -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | mkdocs: 5 | container_name: mkdocs 6 | build: ./docker/ 7 | restart: always 8 | ports: 9 | - "8000:8000" 10 | environment: 11 | LIVE_RELOAD_SUPPORT: 'true' 12 | FAST_MODE: 'true' 13 | DOCS_DIRECTORY: 'docs' 14 | volumes: 15 | - ./:/mkdocs 16 | working_dir: /mkdocs 17 | command: serve --dev-addr=0.0.0.0:8000 18 | -------------------------------------------------------------------------------- /docker-compose.ngnix.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | mkdocs: 5 | container_name: mkdocs 6 | build: ./docker/ 7 | restart: "no" 8 | environment: 9 | LIVE_RELOAD_SUPPORT: 'false' 10 | FAST_MODE: 'true' 11 | DOCS_DIRECTORY: 'docs' 12 | volumes: 13 | - ./:/mkdocs 14 | working_dir: /mkdocs 15 | command: build 16 | 17 | nginx: 18 | image: nginx:alpine 19 | restart: always 20 | ports: 21 | - "8000:8080" 22 | volumes: 23 | - ./site/:/usr/share/nginx/html/ 24 | - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:rw 25 | -------------------------------------------------------------------------------- /docs/std/727.md: -------------------------------------------------------------------------------- 1 | ###### #std727 2 | 3 | # Размеры экрана 4 | 5 | ###### 1. 6 | 7 | `1280х768` типовое разрешение экрана. 8 | 9 | `96 DPI` (точек на дюйм) следует включить при разработке интерфейсов. Это 100% масштаба. 10 | 11 | ###### 2. 12 | Типовое расположение окна программы: 13 | 14 | - Развернуть на весь экран 15 | - Панель задач ОС снизу (40 пикселей) 16 | - Работа в браузере. Панель браузера сверху (60 пикселей) 17 | 18 | ###### 3. 19 | `1280х668` рабочая область. 20 | 21 | ###### 4. 22 | Элементы форм должны помещаться без вертикальной и горизонтальной полос прокрутки. 23 | В списках вертикальная полоса прокрутки допускается. 24 | 25 | ###### Источник 26 | 27 | https://its.1c.ru/db/v8std#content:727 -------------------------------------------------------------------------------- /docs/std/547.md: -------------------------------------------------------------------------------- 1 | ###### #std547 2 | 3 | # Ограничение на использование оператора Перейти 4 | 5 | ###### 1. 6 | 7 | Не используйте оператор `#!bsl Перейти`. Запутаете себя и других запутаете. Используйте другие способы ветвления кода. 8 | 9 | !!! failure "Неправильно" 10 | 11 | ```bsl 12 | Если ПланВидовРасчета = Объект.ПланВидовРасчета Тогда 13 | 14 | Перейти ~ПланВидовРасчета; 15 | 16 | КонецЕсли; 17 | ``` 18 | 19 | !!! success "Правильно" 20 | 21 | ```bsl 22 | Если ПланВидовРасчета = Объект.ПланВидовРасчета Тогда 23 | 24 | ОбработатьПланВидовРасчета(); 25 | 26 | КонецЕсли; 27 | ``` 28 | 29 | ###### 2. 30 | 31 | Оператор `#!bsl Перейти` не поддерживается в веб-клиенте. Можно получить ошибку в режиме исполнения. 32 | 33 | ###### Источник 34 | 35 | https://its.1c.ru/db/v8std#content:547 36 | -------------------------------------------------------------------------------- /overrides/main.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block analytics %} 4 | {{ super() }} 5 | 6 | 7 | 19 | 20 | 21 | {% endblock %} -------------------------------------------------------------------------------- /docs/support.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide: 3 | - navigation 4 | - toc 5 | - feedback 6 | --- 7 | 8 | # Помочь 9 | 10 | ### Нашли ошибку? 11 | 12 | Рано или поздно мы поддержим все стандарты и все правила статического анализа кода. 13 | 14 | [Пожаловаться или предложить идею](https://github.com/zeegin/v8std/issues/new){ .md-button } 15 | 16 | ### Хотите внести исправление? 17 | 18 | Можно просто нажать на иконку `Редактировать` и прислать Pull Request. 19 | 20 | Хотите изменить дизайн и посмотреть, как отладить сайт локально? 21 | Выполните следующие операции на своем компьютере: 22 | 23 | ```cmd 24 | pip install --upgrade pip 25 | pip install mkdocs mkdocs-material mkdocs-minify-plugin mkdocs-redirects pygments-bsl 26 | 27 | git clone https://github.com/zeegin/v8std.git 28 | 29 | cd v8std 30 | 31 | mkdocs serve --watch-theme 32 | ``` 33 | 34 | Теперь по адресу `http://127.0.0.1:8000` можно открыть документацию на своем компьютере. 35 | -------------------------------------------------------------------------------- /docs/std/438.md: -------------------------------------------------------------------------------- 1 | ###### #std438 2 | 3 | # Проверка на пустой результат выполнения запроса 4 | 5 | ###### 1. 6 | 7 | Используйте метод `#!bsl Пустой` чтобы проверить есть ли выбранные строки в результате запроса. Так не будет тратиться время на выгрузку результата в таблицу значений. 8 | 9 | !!! failure "Неправильно" 10 | 11 | ```bsl 12 | Выборка = Запрос.Выполнить().Выбрать(); 13 | Если Выборка.Следующий() Тогда 14 | Возврат Истина; 15 | Иначе 16 | Возврат Ложь; 17 | КонецЕсли; 18 | ``` 19 | 20 | !!! success "Правильно" 21 | 22 | ```bsl 23 | Возврат Не Запрос.Выполнить().Пустой() 24 | ``` 25 | 26 | ###### 2. 27 | 28 | Не используйте метод `#!bsl Пустой` для проверки когда собираетесь выбирать или выгружать данные из результата запроса. 29 | 30 | !!! failure "Неправильно" 31 | 32 | ```bsl 33 | РезультатЗапроса = Запрос.Выполнить(); 34 | Если Не РезультатЗапроса.Пустой() Тогда // избыточный вызов 35 | Выборка = РезультатЗапроса.Выбрать(); 36 | Пока Выборка.Следующий() Цикл 37 | ... 38 | ``` 39 | 40 | !!! success "Правильно" 41 | 42 | ```bsl 43 | Выборка = Запрос.Выполнить().Выбрать(); 44 | Пока Выборка.Следующий() Цикл 45 | ... 46 | ``` 47 | 48 | ###### Источник 49 | 50 | https://its.1c.ru/db/v8std#content:438 -------------------------------------------------------------------------------- /docs/std/454.md: -------------------------------------------------------------------------------- 1 | ###### #std454 2 | 3 | # Правила образования имен переменных 4 | 5 | ###### 1. 6 | 7 | Имена переменных берите от терминов предметной области. Из имени должно быть понятно назначение. 8 | 9 | ###### 2. 10 | 11 | Формируйте имена так: 12 | 13 | - Удалите пробелы между словами. 14 | - Каждое новое слово напишите с большой буквы. 15 | - Предлоги и местоимения пишите большими буквами. 16 | 17 | !!! failure "Неправильно" 18 | 19 | ```bsl 20 | масРеквизитов, соотвВидИмя, новСтр 21 | ``` 22 | 23 | !!! success "Правильно" 24 | 25 | ```bsl 26 | Перем ДиалогРаботыСКаталогом; // Диалог работы с каталогом 27 | Перем КоличествоПачекВКоробке; // Количество пачек в коробке 28 | ``` 29 | 30 | ###### 3. 31 | 32 | Не начинайте имена переменных с подчеркивания `#!bsl _ИмяПеременной`. 33 | 34 | ###### 4. 35 | 36 | Не делайте имена переменных из одного символа. Хотя это допускается для счетчиков цикла. 37 | 38 | ###### 5. 39 | 40 | Названия булевых переменных пишутся так, как пишется истинное значение, хранимое в переменной. 41 | 42 | !!! success "Правильно" 43 | 44 | ```bsl 45 | Перем ЕстьОшибки; // Признак наличия ошибок в процедуре. 46 | Перем ЭтоТоварТара; // Признак, что товар относится к возвратной таре. 47 | ``` 48 | 49 | ###### См. также 50 | 51 | - Использование переменных в программных модулях #std639 52 | 53 | ###### Источник 54 | 55 | https://its.1c.ru/db/v8std#content:454 56 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | # Simple workflow for deploying static content to GitHub Pages 2 | name: gh-pages 3 | 4 | on: 5 | push: 6 | branches: 7 | - main 8 | 9 | # Allows you to run this workflow manually from the Actions tab 10 | workflow_dispatch: 11 | 12 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 13 | permissions: 14 | contents: read 15 | pages: write 16 | id-token: write 17 | 18 | # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. 19 | # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. 20 | concurrency: 21 | group: "pages" 22 | cancel-in-progress: false 23 | 24 | jobs: 25 | # Single deploy job since we're just deploying 26 | deploy: 27 | environment: 28 | name: github-pages 29 | url: ${{ steps.deployment.outputs.page_url }} 30 | runs-on: ubuntu-latest 31 | steps: 32 | - name: Checkout 33 | uses: actions/checkout@v4 34 | - name: Set up Python 35 | uses: actions/setup-python@v5 36 | with: 37 | architecture: 'x64' 38 | - name: Install dependencies 39 | run: | 40 | pip install --upgrade pip 41 | pip install mkdocs mkdocs-material pygments-bsl 42 | - name: Build 43 | run: | 44 | mkdocs build 45 | - name: Setup Pages 46 | uses: actions/configure-pages@v4 47 | - name: Upload artifact 48 | uses: actions/upload-pages-artifact@v3 49 | with: 50 | path: 'site' 51 | - name: Deploy to GitHub Pages 52 | id: deployment 53 | uses: actions/deploy-pages@v4 54 | -------------------------------------------------------------------------------- /docs/std/794.md: -------------------------------------------------------------------------------- 1 | ###### #std794 2 | 3 | # Ограничения на использование внешних ресурсов 4 | 5 | ###### 1. 6 | Используйте средства платформы вместо внешних компонент, приложений операционной системы или COM. 7 | 8 | !!! example "Например" 9 | 10 | Используйте метод `#!bsl ВызватьПаузу` вместо средств операционной системы, внешних компонент или COM. 11 | 12 | ###### 2. 13 | 14 | Для настроек профилей безопасности используйте соответствующую подсистему БСП. 15 | 16 | [Библиотека стандартных подсистем. Пользовательская документация. 5.51 Профили безопасности](https://its.1c.ru/db/bsp3111doc/content/2970/hdoc) 17 | 18 | Все внешние ресурсы заявите в `#!bsl РаботаВБезопасномРежимеПереопределяемый`. 19 | 20 | Внешние ресурсы могут быть статичными или их состав может динамически меняться по настройкам и функциональным опциям. 21 | 22 | Когда функцинальность приложения, использующая внешние ресурсы, включается или выключается, необходимо запросить у администратора разрешение на включение доступа к ним. Для этого можно использовать БСП `#!bsl РаботаВБезопасномРежимеКлиент`. 23 | 24 | !!! quote "В стандарте не указано" 25 | 26 | Идея помочь сконфигурировать профили безопасности кластера такая: что конфигурация рассказывает, чем она принципиально обладает - она правильная. 27 | 28 | Идея, что управлять этим должен администратор приложения - не правильная. 29 | 30 | Профили безопасности придуманы, чтобы защитить кластер от недобросовестного приложения и недобросовестного администратора приложения. Потому принимать профиль ВСЕГДА должен администратор кластера. 31 | 32 | К сожалению, на текущий момент готовых механизмов общих не существует. Идеологически верно работает только модель сервиса (фрешик). 33 | 34 | ###### Источник 35 | 36 | https://its.1c.ru/db/v8std#content:794 37 | -------------------------------------------------------------------------------- /docs/assets/stylesheets/extra.css: -------------------------------------------------------------------------------- 1 | /* Color for header at dark*/ 2 | [data-md-color-scheme=slate] .md-header { 3 | background-color: #16171D; 4 | } 5 | 6 | /* disable toc nav*/ 7 | .md-nav--secondary { 8 | display: none; 9 | } 10 | 11 | /* Color for iterators */ 12 | .md-typeset h6 { 13 | color: #CDCDCD; 14 | } 15 | 16 | /* Color for iterators at dark */ 17 | [data-md-color-scheme=slate] .md-typeset h6 { 18 | opacity: .2 19 | } 20 | /* Color for anchors at dark */ 21 | [data-md-color-scheme=slate] a { 22 | color: #95A0EB; 23 | } 24 | 25 | /* Color for youtube icon */ 26 | .youtube { 27 | color: #EE0F0F; 28 | } 29 | 30 | /* Icon after offsite links */ 31 | .md-main a[href^="http"]:not(.md-button):after { 32 | content: ''; 33 | display: inline-block; 34 | width: 1em; 35 | height: 1em; 36 | margin-left: 0.25em; 37 | background-size: 100%; 38 | background-color: var(--md-typeset-a-color); 39 | mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3C!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--%3E%3Cpath d='M320 0c-17.7 0-32 14.3-32 32s14.3 32 32 32h82.7L201.4 265.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L448 109.3V192c0 17.7 14.3 32 32 32s32-14.3 32-32V32c0-17.7-14.3-32-32-32zM80 32C35.8 32 0 67.8 0 112v320c0 44.2 35.8 80 80 80h320c44.2 0 80-35.8 80-80V320c0-17.7-14.3-32-32-32s-32 14.3-32 32v112c0 8.8-7.2 16-16 16H80c-8.8 0-16-7.2-16-16V112c0-8.8 7.2-16 16-16h112c17.7 0 32-14.3 32-32s-14.3-32-32-32z'%3E%3C/path%3E%3C/svg%3E"); 40 | transform: translateY(0.15em); 41 | } 42 | 43 | /* Icon after offsite links at dark */ 44 | [data-md-color-scheme=slate] .md-main a[href^="http"]:not(.md-button):after { 45 | background-color: #95A0EB; 46 | } 47 | 48 | /* Icon after offsite links hover */ 49 | .md-main a[href^="http"]:not(.md-button):hover:after { 50 | background-color: var(--md-accent-fg-color); 51 | } 52 | -------------------------------------------------------------------------------- /docs/std/686.md: -------------------------------------------------------------------------------- 1 | ###### #std686 2 | 3 | # Работа с параметром "Отказ" в обработчиках событий 4 | 5 | ###### 1. 6 | 7 | Параметру `#!bsl Отказ` не присваивайте `#!bsl Ложь`. 8 | 9 | Если ему присвоить `#!bsl Ложь`, то можно случайно сбросить ранее установленный `#!bsl Истина`. 10 | 11 | Установка `#!bsl Ложь` может быть неявной: через булеву функцию. Потому и результат функции тоже не присваивайте. 12 | 13 | !!! failure "Неправильно" 14 | 15 | ```bsl 16 | Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) 17 | ... 18 | Отказ = ЕстьОшибки(); 19 | ... 20 | КонецПроцедуры 21 | ``` 22 | и 23 | ```bsl 24 | Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) 25 | ... 26 | Отказ = Ложь; 27 | ... 28 | КонецПроцедуры 29 | ``` 30 | 31 | 32 | !!! success "Правильно" 33 | 34 | ```bsl 35 | Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) 36 | ... 37 | Если ЕстьОшибки() Тогда 38 | Отказ = Истина; 39 | КонецЕсли; 40 | ... 41 | КонецПроцедуры 42 | ``` 43 | или 44 | ```bsl 45 | Отказ = Отказ Или ЕстьОшибки(); 46 | ``` 47 | 48 | ###### 2. 49 | 50 | Вообще это правило подходит для любых возвращаемых булевых параметров, например `#!bsl СтандартнаяОбработка`, `#!bsl Выполнение`. 51 | 52 | ###### 3. 53 | 54 | Если устанавливаете параметр `#!bsl Отказ` в `#!bsl Истина`, то объясняйте пользователю что случилось. 55 | 56 | Платформа покажет сообщение об ошибке с текстом, например `Не удалось записать "Заказ покупателя"!`, из которого пользователь не поймет что именно произошло. 57 | 58 | Уведомлять пользователя надо по стандарту [#std400: Информирование пользователя](400.md) с помощью сообщения, или отказаться от установки параметра `#!bsl Отказ` и вызвать исключение. 59 | 60 | ###### См. также 61 | 62 | - [#std400: Информирование пользователя](400.md) 63 | - [#std499: Перехват исключений в коде](499.md) 64 | - [#std585: Сообщения пользователю](585.md) 65 | 66 | ###### Источник 67 | 68 | https://its.1c.ru/db/v8std#content:686 69 | -------------------------------------------------------------------------------- /docs/std/791.md: -------------------------------------------------------------------------------- 1 | ###### #std791 2 | 3 | # Дополнительные индексы 4 | 5 | **Дополнительный индекс** – это индекс сразу по нескольким полям объекта метаданных. 6 | 7 | ###### 1 8 | 9 | Дополнительные индексы доступны только для КОРП платформы. Для ПРОФ платформы использовать не получится. 10 | 11 | ###### 2 12 | 13 | При разработке надо тестировать производительность в двух случаях: 14 | 15 | - доп. индексы включены 16 | - доп. индексы выключены 17 | 18 | Для таблиц до 1 млн записей должно работать быстро без доп. индексов. 19 | Для больших таблиц - производительность должна гарантироваться доп. индексами. 20 | 21 | !!! quote "В стандарте не указано" 22 | 23 | Доп. индексы управляются параметром информационной базы `Использовать дополнительные индексы`. Его можно изменить через конфигуратор или программно `#!bsl УстановитьИспользованиеДополнительныхИндексов()`. 24 | 25 | Реальное перестроение индекса произойдет при следующем обновлении конфигурации с реструктуризацией или запуском тестирования и исправления в режиме включения КОРП функций. 26 | 27 | ###### 3 28 | 29 | Не используйте доп. индексы если можно достичь хорошей производительности без них. 30 | 31 | ###### 4 32 | 33 | Не делайте несколько веток кода в зависимости от использования доп. индексов. 34 | 35 | !!! failure "Неправильно" 36 | 37 | ```bsl 38 | Если ПолучитьИспользованиеДополнительныхИндексов() Тогда 39 | 40 | // Особенности при включенных доп. индексах 41 | 42 | КонецЕсли; 43 | ``` 44 | 45 | ###### 4.1 46 | 47 | Все, что написано выше, можно игнорировать, потому что если очень хочется, то на небольшом объеме можно и доп. индексы использовать, и делать ветки в коде. 48 | 49 | !!! quote "В стандарте не указано" 50 | 51 | Не понятно зачем нужен этот пункт "подстилка", ведь для того чтобы не исполнить стандарт разрешение стандарта не нужно :) 52 | 53 | ###### 5 54 | 55 | Поле в доп. индекс добавляют в двух случаях: 56 | 57 | - чтобы использовать в условиях запросов - как индексируемое (ключевое) поле 58 | - чтобы исключить обращение к таблице - как дополнительное (неключевое) поле 59 | 60 | !!! quote "В стандарте не указано" 61 | 62 | Подход с дополнительными (неключевыми) полями называют **покрывающий индекс**. Его суть в том, что дополнительные данные можно извлечь прям из индекса, и делать обращение к реальной таблице с данными не придется. 63 | 64 | ###### См. также 65 | 66 | - [Индексы объектов метаданных](https://its.1c.ru/db/v8326doc#bookmark:dev:TI000002802) 67 | - [Индексы таблиц базы данных](https://its.1c.ru/db/metod8dev#content:1590:hdoc) 68 | - [Серверная лицензия](https://its.1c.ru/db/v8326doc#bookmark:adm:TI000001232) 69 | 70 | ###### Источник 71 | 72 | https://its.1c.ru/db/v8std#content:791 73 | -------------------------------------------------------------------------------- /docs/std/678.md: -------------------------------------------------------------------------------- 1 | ###### #std678 2 | 3 | # Безопасность прикладного программного интерфейса сервера 4 | 5 | ###### 1. 6 | 7 | Злоумышленник может вызвать серверный код с клиента. Например, он может выполнять запросы по HTTP, пытаясь повторить поведение клиента платформы. Своими действиями злоумышленник не должен получить несанкционированный доступ к данным пользователей или нарушить работоспособность сервера. 8 | 9 | ###### 1.1. 10 | 11 | Все серверные функции, доступные для вызова с клиента представляют потенциальную угрозу. 12 | 13 | - Экспортный процедуры и функции из общих модулей с флажками `Сервер` и `Вызов сервера`. Такие функции можно вызывать напрямую с клиента. #std679 14 | - Функции модулей форм с директивами компиляции `#!bsl &НаСервере`, `#!bsl &НаСервереБезКонтекста`. Такие функции можно вызывать в контексте клиента после получения формы, даже когда функции не экспортные. 15 | 16 | !!! danger "Уязвимость" 17 | 18 | ```bsl title="Код модуля формы Справочник.Сотрудники.ФормаЭлемента" 19 | &НаКлиенте 20 | Процедура УволитьСотрудника(Команда) 21 | 22 | Если ДатаРегистрацииУвольнения > ДатаЗапрета Тогда 23 | ЗарегистрироватьУвольнение(); 24 | КонецЕсли; 25 | 26 | КонецПроцедуры 27 | 28 | &НаСервере 29 | Процедура ЗарегистрироватьУвольнение() 30 | ... 31 | КонецПроцедуры 32 | ``` 33 | 34 | ```bsl title="Пример стороннего кода, исполняемого в обход проверки на клиенте" 35 | ПараметрыФормы = Новый Структура("Ключ", ВыбранныйСотрудник); 36 | Форма = ПолучитьФорму("Справочник.Сотрудники.ФормаЭлемента", ПараметрыФормы); 37 | Форма.ЗарегистрироватьУвольнение(); 38 | ``` 39 | 40 | ###### 1.2. 41 | 42 | При разработке формы исключите из кода ее модуля бизнес-логику. Код формы должен содержать только клиент-серверное взаимодействие и обработку реквизитов формы. 43 | 44 | ###### 1.3. 45 | 46 | Тщательно тестируйте код, в котором устанавливается привилегированный режим или который расположен в общих модулях с флажком `Привилегированный`. #std485 47 | 48 | ###### 2. 49 | 50 | Любые возможности конфигурации исполнить "внешний" код или произвольные тексты запросов на сервере, не являющиеся частью программы, потенциально опасны. 51 | 52 | - Внешние отчеты и обработки 53 | - COM-объекты 54 | - Внешние компоненты 55 | 56 | Внешние отчеты и обработки могут обращаться ко всем общим модулям без флажка `Вызов сервера`, к модулям объектов и менеджеров объектов конфигурации, пытаться установить привилегированный режим. 57 | 58 | Такие возможности создают угрозы #std669: 59 | 60 | - Работоспособности сервера 61 | - Порчу или хищение данных 62 | - Зависание или зацикливание рабочего процесса 63 | - Утечки памяти 64 | - Ресурсоемкие операции и запросы 65 | 66 | ###### 3. 67 | 68 | Клиентское приложение (тонкий клиент, веб-браузер) не гарантирует безопасность данных, переданных на сторону клиента. Вредоносные программы (вирусы, зловреды) могут перехватить и прочитать данные, полученные клиентом. 69 | 70 | Серверные процедуры и функции должны возвращать в форму только окончательный результат расчета. Не передавайте в форму исходных или промежуточных данных, которые могут раскрывать побочную, возможно приватную информацию бизнес-процесса. 71 | 72 | ###### Источник 73 | 74 | https://its.1c.ru/db/v8std#content:678 75 | -------------------------------------------------------------------------------- /docs/std/467.md: -------------------------------------------------------------------------------- 1 | ###### #std467 2 | 3 | # Общие требования к конфигурации 4 | 5 | ###### 1.1. 6 | 7 | Используйте только штатные и документированные возможности платформы. 8 | 9 | Если вы нашли какой-то трюк, который не описан в документации - не используйте его. Нет никаких гарантий, что этот трюк будет работать в следующей версии платформы. 10 | 11 | ###### 1.2. 12 | 13 | Платформа может работать в различных СУБД, операционных системах, браузерах. 14 | Рассчитывайте на работу в разной среде. 15 | 16 | - Ключевые операции требуется поддерживать без использования расширения для работы с файлами. #std700 17 | - Взаимодействовать с пользователем требуется асинхронно. #std703 18 | - Требуется поддерживать работу в Linux и macOS. #std723 19 | - [Системные требования 1С:Предприятия 8](https://v8.1c.ru/tekhnologii/sistemnye-trebovaniya-1s-predpriyatiya-8/) 20 | - [Приложение 7. Особенности поведения системы в различных режимах](https://its.1c.ru/db/v83doc/bookmark/dev/TI000001285) 21 | - [Приложение 8. Особенности работы с различными СУБД](https://its.1c.ru/db/v83doc/bookmark/dev/TI000001285) 22 | 23 | ###### 1.3. 24 | 25 | Исправляйте ошибки обнаруженные при проверке конфигурации. 26 | Чтобы запустить статический анализ, откройте конфигуратор и перейдите в меню `Конфигурация` – `Проверка конфигурации...`. 27 | 28 | Исключения: 29 | 30 | - Обработчики событий модуля формы, подключаемые из кода #std492 31 | - Ограничение на использование модальных окон и синхронных вызовов #std703 32 | - Ограничение на установку признака Вызов сервера у общих модулей #std679 33 | - Несущественные предупреждения проверки конфигурации #std759 34 | 35 | ###### 1.4. 36 | 37 | Поддержите работу в режиме толстого клиента обычного приложения в минимальном виде для администраторов. 38 | Старые технологии могли использоваться во внешних обработках или отчетах, которые внедрялись много лет назад. Отказаться от них совсем будет нечестно по отношению к администраторам. Администраторы могут рассчитывать что их старые инструменты запустятся, как и раньше. 39 | 40 | - Переключите свойство конфигурации `Использовать управляемые формы в обычном приложении` в `Истина`. 41 | - Переключите свойство конфигурации `Использовать обычные формы в управляемом режиме` в `Ложь`. 42 | - Создавайте общие модули по стандарту #std469. 43 | - Пользуйтесь режимом редактирования для режимов запуска `управляемое и обычное приложение`. Включите в меню `Сервис` – `Параметры` – закладка `Общие`. 44 | 45 | ###### 1.5. 46 | 47 | Не делайте пользовательские интерфейсы сильно отличающимися от интерфейса по умолчанию. Это может пугать пользователей. 48 | 49 | ###### 2.1. 50 | 51 | Пишите тексты грамотно. Не допускайте ошибок. 52 | 53 | ###### 2.2. 54 | 55 | Не оставляйте после себя мертвый код и мертвые объекты метаданных. Все, что не используется - удалите. 56 | 57 | ###### 2.3. 58 | 59 | Метаданные верхнего уровня сортируйте по имени. Подчиненные метаданные, реквизиты, измерения, формы - располагайте в соответствии со своим проектным решением. 60 | 61 | Исключения: 62 | 63 | - Общим реквизитам разделителям установите порядок в дереве метаданных в зависимости от требуемого порядка установки параметров сеанса. #std677 64 | - Устаревшие объекты размещайте в конце ветки метаданных. #std534 65 | 66 | ###### Источник 67 | 68 | https://its.1c.ru/db/v8std#content:467 69 | -------------------------------------------------------------------------------- /overrides/home.html: -------------------------------------------------------------------------------- 1 | {% extends "main.html" %} 2 | 3 | 4 | {% block tabs %} 5 | {{ super() }} 6 | 7 | 8 | 91 | 92 | 93 |
94 |
95 |
96 | 97 | 98 |
99 | 106 |
107 | 108 | 109 |
110 |

v8std.ru: Стандарты разработки 1С

111 |

{{ config.site_description }}

112 |

Система стандартов и методик разработки конфигураций для платформы 1С:Предприятие 8. 113 | Исходные стандарты опубликованы на сайте ИТС https://its.1c.ru/db/v8std.

114 | Этот проект создан для того, чтобы описать эти же стандарты другими словами.
115 | Что-то опущено, что-то детализировано. Суть та же.

116 | 121 | Читать 122 | 123 | 129 | Новости в телеграм 130 | 131 |
132 |
133 |
134 |
135 | {% endblock %} 136 | 137 | 138 | {% block content %}{% endblock %} 139 | -------------------------------------------------------------------------------- /docs/std/647.md: -------------------------------------------------------------------------------- 1 | ###### #std647 2 | 3 | # Имена процедур и функций 4 | 5 | ###### 1. 6 | 7 | Чем лучше имена - тем проще читать код. Хорошо выбранное имя процедуры и имена параметров описывают её смысл лучше, чем комментарии. Если имя подобрать сложно - возможно, уже есть проблема в архитектуре решения. Если самодокументирующееся имя придумать легко - все спроектировано верно. 8 | 9 | См. Описание процедур и функций #std453 10 | 11 | ###### 2. 12 | 13 | Имена процедур, функций и параметров берите от терминов предметной области. Из имени должно быть понятно назначение. Старайтесь выбирать говорящие (самодокументирующиеся) имена. 14 | 15 | См. Параметры процедур и функций #std640 16 | 17 | !!! failure "Неправильно" 18 | 19 | ```bsl 20 | Функция ВыполнитьПроверку(Параметр1, Рекв, ТЗ) 21 | Функция ПолучитьМассивыРеквизитов(ХозяйственнаяОперация, МассивВсехРеквизитов, МассивРеквизитовОперации) 22 | ``` 23 | 24 | !!! success "Правильно" 25 | 26 | ```bsl 27 | Функция РеквизитОбъектаЗаданногоТипа(Объект, ИмяРеквизита, ТипЗначения) 28 | Функция ЗаполнитьИменаРеквизитовПоХозяйственнойОперации(ХозяйственнаяОперация, ИменаВсеРеквизиты, ИменаРеквизитыОперации) 29 | ``` 30 | 31 | ###### 3. 32 | 33 | Формируйте имена так: 34 | 35 | - Удалите пробелы между словами. 36 | - Каждое новое слово напишите с большой буквы. 37 | - Предлоги и местоимения пишите большими буквами. 38 | 39 | ###### 4. 40 | 41 | Не используйте типы в названиях процедур и функций. Использовать можно только если без использования неясно название метода. 42 | 43 | !!! failure "Неправильно" 44 | 45 | ```bsl 46 | Функция ПолучитьМассивРолейСПравомДобавления() 47 | Функция ПолучитьСтруктуруДополнительныхНастроек() 48 | ``` 49 | 50 | !!! success "Правильно" 51 | 52 | ```bsl 53 | Функция ИменаРолейСПравомДобавления() 54 | Функция ДополнительныеНастройки() 55 | ``` 56 | 57 | ###### 5. 58 | 59 | Имена процедур берите от неопределенной формы глагола. От сути выполняемого действия. 60 | 61 | !!! failure "Неправильно" 62 | 63 | ```bsl 64 | Процедура ЗагрузкаКонтрагента() 65 | ``` 66 | 67 | !!! success "Правильно" 68 | 69 | ```bsl 70 | Процедура ЗагрузитьКонтрагента() 71 | ``` 72 | 73 | ###### 6.1. 74 | 75 | Имена функций берите от описания возвращаемого значения. 76 | 77 | !!! failure "Неправильно" 78 | 79 | ```bsl 80 | Функция ПолучитьПолноеИмя() 81 | Функция СоздатьПараметрыЗаполненияЦенПоставщика() 82 | Функция ОпределитьДатуНачалаСеанса() 83 | ``` 84 | 85 | !!! success "Правильно" 86 | 87 | ```bsl 88 | Функция ПолноеИмя() 89 | Функция НовыеПараметрыЗаполненияЦенПоставщика() 90 | Функция ДатаНачалаСеанса() 91 | ``` 92 | 93 | ###### 6.2. 94 | 95 | Если функция создает какой-то объект, назовите его со слова `Новый`. 96 | 97 | !!! failure "Неправильно" 98 | 99 | ```bsl 100 | Функция ДобавитьПолеФормы() 101 | Функция СоздатьЭлементСправочникаФайлы() 102 | Функция ПолучитьТаблицуКоманд() 103 | ``` 104 | 105 | !!! success "Правильно" 106 | 107 | ```bsl 108 | Функция НовоеПолеФормы() 109 | Функция НовыйЭлементСправочникаФайлы() 110 | Функция НоваяТаблицаКоманд() 111 | ``` 112 | 113 | ###### 6.3. 114 | 115 | Если функция выполняет проверку, назовите ее со слова `Это` или используйте причастие. 116 | 117 | !!! failure "Неправильно" 118 | 119 | ```bsl 120 | Функция ПроверитьПроведенностьДокумента() 121 | Функция ПроверитьИзменениеРеквизитовДокумента() 122 | Функция ВнешняяЗадача() 123 | ``` 124 | 125 | !!! success "Правильно" 126 | 127 | ```bsl 128 | Функция ДокументПроведен() 129 | Функция РеквизитыДокументыИзменены() 130 | Функция ЭтоВнешняяЗадача() 131 | ``` 132 | 133 | ###### 6.4. 134 | 135 | Если для понимания назначения функции важно каким образом было получено возвращаемое значение, назовите ее от глагола в неопределенной форме. 136 | 137 | !!! success "Правильно" 138 | 139 | ```bsl 140 | Функция ВыбратьДанныеПоПравилу(Правило, ПользовательскиеНастройки) 141 | Функция ПреобразоватьДанныеПоПравилу(НаборыДанных, ПараметрыПреобразования) 142 | ``` 143 | 144 | ###### 6.5. 145 | 146 | Если функция используется как процедура, ее действие - основная задача, ее результат - побочный эффект, называйте функции как процедуры. Используйте глагол неопределенной формы. Например, возвращает признак выполненного действия. 147 | 148 | !!! success "Правильно" 149 | 150 | ```bsl 151 | Функция РазрешитьРедактированиеРеквизитовОбъекта(Форма) 152 | ``` 153 | 154 | ###### Источник 155 | 156 | https://its.1c.ru/db/v8std#content:647 157 | -------------------------------------------------------------------------------- /docs/std/726.md: -------------------------------------------------------------------------------- 1 | ###### #std726 2 | 3 | # Особенности использования в запросах оператора ПОДОБНО 4 | 5 | ###### 1. 6 | 7 | Оператор `#!sdbl ПОДОБНО` в тексте запроса используйте только 8 | 9 | - с константным строковым литералом, например: 10 | `#!sdbl Реквизит ПОДОБНО "123%"` 11 | - с параметром запроса, например: 12 | `#!sdbl Реквизит ПОДОБНО &Шаблон` 13 | 14 | Не создавайте строку шаблона вычислениями или конкатенацией. 15 | 16 | 17 | !!! failure "Неправильно" 18 | 19 | ```sdbl 20 | Реквизит ПОДОБНО "123" + "%" 21 | Реквизит ПОДОБНО &Шаблон + "%" 22 | Реквизит ПОДОБНО Таблица.Шаблон 23 | ``` 24 | 25 | !!! success "Правильно" 26 | 27 | ```sdbl 28 | Реквизит ПОДОБНО "123%" 29 | Реквизит ПОДОБНО &Шаблон 30 | ``` 31 | 32 | !!! quote "В стандарте не указано" 33 | 34 | PostgreSQL и Oracle Database: 35 | 36 | Квадратные скобки `#!sdbl […]` в шаблоне работают как спецсимволы в строковом литерале, и не работают в выражении. 37 | 38 | ```sdbl title="Cкобки имеют специальный смысл" 39 | ВЫБРАТЬ * Справочник.Товары ГДЕ Артикул ПОДОБНО "123[АБ]%" 40 | ``` 41 | 42 | ```sdbl title="Cкобки в переменной &Шаблон это просто текст" 43 | ВЫБРАТЬ * Справочник.Товары ГДЕ Артикул ПОДОБНО &Шаблон + "%" 44 | ``` 45 | 46 | ```sdbl title="Cкобки в переменной &Шаблон имеют специальный смысл" 47 | ВЫБРАТЬ * Справочник.Товары ГДЕ Артикул ПОДОБНО &Шаблон 48 | ``` 49 | 50 | - [Приложение 8. Особенности работы с различными СУБД](https://its.1c.ru/db/v851doc#bookmark:dev:TI000001291) 51 | 52 | ###### 2. 53 | 54 | Используйте такие шаблоны оператора `#!sdbl ПОДОБНО`, которые работают одинаково на всех поддерживаемых СУБД. 55 | 56 | Допустимо: 57 | 58 | - `#!sdbl %` (процент) – последовательность, содержащая любое количество произвольных символов; 59 | - `#!sdbl _` (подчеркивание) – один произвольный символ. 60 | 61 | Не работает в IBM DB2: 62 | 63 | - `#!sdbl […]` (в квадратных скобках один или несколько символов) – любой одиночный символ из перечисленных внутри квадратных скобок. В перечислении могут встречаться диапазоны, например `#!sdbl [a-z]`, означающие произвольный символ, входящий в диапазон, включая концы диапазона; 64 | - `#!sdbl [^…]` (в квадратных скобках значок отрицания, за которым следует один или несколько символов) – любой одиночный символ, кроме тех, которые перечислены следом за значком отрицания. 65 | 66 | Ограничение в MS SQL 2005: 67 | 68 | - Длина строки шаблона не должна превышать `1024` символа 69 | 70 | ###### 3. 71 | 72 | В шаблонах подобия используются спецсимволы `#!sdbl _%[]^`. 73 | Шаблоны подобия могут формироваться динамически, по введенным данным пользователя. 74 | В введенных пользователю данных могут использоваться спецсимволы, которые необходимо трактовать как данные пользователя. Для того, чтобы спецсимвол трактовался как обычный символ его необходимо экранировать. 75 | 76 | !!! example "Например" 77 | 78 | Пользователь вводит текст: `Кефир 15% жирности`. 79 | Программа должны этот `%` трактовать как часть строки, а не как спецсимвол последовательности произвольных символов. 80 | 81 | !!! danger "Ошибка" 82 | 83 | При работе на PostgreSQL можно встретить ошибку 84 | `#!log ERROR: invalid regular expression: invalid character range` при выполнении запроса с некорректно собранным фрагментом содержащим `[]`. 85 | 86 | Для экранирования: 87 | 88 | - выберите спецсимвол экранирования, например `~`; 89 | - установите спецсимвол перед символами операнда, например `~%`. Чтобы экранировать выбранный спецсимвол, его необходимо задвоить, например `~~`. 90 | - дополните шаблон ключевым словом `#!sdbl СПЕЦСИМВОЛ`. 91 | 92 | !!! example "Например" 93 | 94 | Для поиск по строке `100%` 95 | ```sdbl 96 | "100~%" СПЕЦСИМВОЛ "~" 97 | ``` 98 | 99 | Для поиск по строке `Кефир 15% жирности` 100 | ```sdbl 101 | "Кефир 15~% жирности" СПЕЦСИМВОЛ "~" 102 | ``` 103 | 104 | Для поиск по строке `Шуруп_10[21] медь~4%` 105 | ```sdbl 106 | "Шуруп~_10~[21~] медь~~4~%" СПЕЦСИМВОЛ "~" 107 | ``` 108 | 109 | Установка параметров запроса с помощью `#!bsl Запрос.УстановитьПараметр()` не экранирует спецсимволы шаблона подобия. 110 | 111 | Для экранирования используйте функцию `#!bsl СформироватьСтрокуДляПоискаВЗапросе()` 112 | 113 | !!! example "Например" 114 | 115 | ```sdbl 116 | ВЫБРАТЬ 117 | Номенклатура.Ссылка КАК Ссылка 118 | ИЗ 119 | Справочник.Номенклатура КАК Номенклатура 120 | ГДЕ 121 | Номенклатура.Наименование ПОДОБНО &Шаблон СПЕЦСИМВОЛ "~" 122 | ``` 123 | 124 | ```bsl 125 | Запрос.УстановитьПараметр("Шаблон", "%" + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(ИскомыйТекст) + "%"); 126 | ``` 127 | 128 | !!! tip "Паттерн" 129 | 130 | ```bsl 131 | Функция СформироватьСтрокуДляПоискаВЗапросе(Знач СтрокаПоиска) Экспорт 132 | 133 | Результат = СтрокаПоиска; 134 | Результат = СтрЗаменить(Результат, "~", "~~"); 135 | Результат = СтрЗаменить(Результат, "%", "~%"); 136 | Результат = СтрЗаменить(Результат, "_", "~_"); 137 | Результат = СтрЗаменить(Результат, "[", "~["); 138 | Результат = СтрЗаменить(Результат, "]", "~]"); 139 | Результат = СтрЗаменить(Результат, "^", "~^"); 140 | 141 | Возврат Результат; 142 | 143 | КонецФункции 144 | ``` 145 | 146 | В 1С:БСП реализован в `#!bsl ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе()`. 147 | 148 | ###### 4. 149 | 150 | Сравнение выполняется без учета регистра символов. 151 | 152 | ###### Источник 153 | 154 | https://its.1c.ru/db/v8std#content:726 -------------------------------------------------------------------------------- /mkdocs.yml: -------------------------------------------------------------------------------- 1 | site_name: Стандарты разработки 1С от Ингвара 2 | site_url: https://v8std.ru 3 | site_author: Ingvar Vilkman 4 | site_description: >- 5 | Частный взгляд Ингвара. 6 | 7 | repo_name: zeegin/v8std 8 | repo_url: https://github.com/zeegin/v8std 9 | edit_uri: edit/master/docs 10 | 11 | copyright: No Rights Reserved CREATIVE COMMONS CC0 12 | 13 | theme: 14 | name: material 15 | custom_dir: overrides 16 | 17 | # Don't include MkDocs' JavaScript 18 | include_search_page: false 19 | search_index_only: true 20 | 21 | language: ru 22 | logo: 'assets/images/logo.png' 23 | favicon: 'assets/images/logo.png' 24 | 25 | features: 26 | - content.code.annotate 27 | - content.code.copy 28 | - content.tabs.link 29 | - header.autohide 30 | - navigation.indexes 31 | - navigation.footer 32 | - navigation.sections 33 | - navigation.tabs 34 | - navigation.top 35 | - navigation.tracking 36 | - search.highlight 37 | - search.share 38 | - search.suggest 39 | palette: 40 | 41 | # Palette toggle for automatic mode 42 | - media: "(prefers-color-scheme)" 43 | toggle: 44 | icon: material/brightness-auto 45 | name: Автоматически 46 | 47 | # Palette toggle for light mode 48 | - media: "(prefers-color-scheme: light)" 49 | scheme: default 50 | primary: white 51 | accent: blue 52 | toggle: 53 | icon: material/brightness-7 54 | name: Выключить свет 55 | 56 | # Palette toggle for dark mode 57 | - media: "(prefers-color-scheme: dark)" 58 | scheme: slate 59 | primary: black 60 | accent: light blue 61 | toggle: 62 | icon: material/brightness-4 63 | name: Включить свет 64 | font: 65 | text: Roboto 66 | code: Roboto Mono 67 | icon: 68 | logo: logo 69 | 70 | plugins: 71 | - search: 72 | lang: 73 | - ru 74 | 75 | extra: 76 | social: 77 | - icon: fontawesome/brands/github 78 | link: 'https://github.com/zeegin/v8std' 79 | - icon: fontawesome/brands/telegram 80 | link: 'https://t.me/v8std' 81 | consent: 82 | title: Cookie 83 | description: >- 84 | Мы используем файлы cookie для распознавания ваших повторных посещений и предпочтений, 85 | а также для оценки эффективности нашей документации и того, находят ли пользователи то, что ищут. 86 | С вашего согласия вы помогаете нам сделать нашу документацию лучше. 87 | cookies: 88 | analytics: Yandex.Metrika 89 | 90 | 91 | extra_css: 92 | - 'assets/stylesheets/extra.css' 93 | 94 | # Extensions 95 | markdown_extensions: 96 | - admonition 97 | - abbr 98 | - attr_list 99 | - def_list 100 | - footnotes 101 | - meta 102 | - md_in_html 103 | - toc: 104 | permalink: true 105 | - pymdownx.arithmatex: 106 | generic: true 107 | - pymdownx.betterem: 108 | smart_enable: all 109 | - pymdownx.critic 110 | - pymdownx.caret 111 | - pymdownx.details 112 | - pymdownx.emoji: 113 | emoji_index: !!python/name:materialx.emoji.twemoji 114 | emoji_generator: !!python/name:materialx.emoji.to_svg 115 | - pymdownx.keys 116 | - pymdownx.magiclink: 117 | repo_url_shorthand: true 118 | user: zeegin 119 | repo: v8std 120 | - pymdownx.mark 121 | - pymdownx.smartsymbols 122 | - pymdownx.superfences: 123 | custom_fences: 124 | - name: mermaid 125 | class: mermaid-experimental 126 | format: !!python/name:pymdownx.superfences.fence_code_format 127 | - pymdownx.tabbed: 128 | alternate_style: true 129 | - pymdownx.tasklist: 130 | custom_checkbox: true 131 | - pymdownx.tilde 132 | - pymdownx.highlight: 133 | anchor_linenums: true 134 | line_spans: __span 135 | pygments_lang_class: true 136 | - pymdownx.inlinehilite 137 | - pymdownx.snippets 138 | 139 | # Page tree 140 | nav: 141 | - Домашняя: index.md 142 | - Стандарты: 143 | - ИТС: 144 | - Создание и изменение объектов метаданных: 145 | - Организация работы конфигурации: 146 | - Общие требования к конфигурации: std/467.md 147 | - Работа в разных часовых поясах: std/643.md 148 | - Реализация обработки данных: 149 | - Работа с запросами: 150 | - Проверка на пустой результат выполнения запроса: std/438.md 151 | - Особенности использования в запросах оператора ПОДОБНО: std/726.md 152 | - Оптимизация запросов: 153 | - Дополнительные индексы: std/791.md 154 | - Обработка и модификация данных: 155 | - "Транзакции: правила использования": std/783.md 156 | - Соглашения при написании кода: 157 | - Оформление модулей: 158 | - Тексты модулей: std/456.md 159 | - Структура модуля: std/455.md 160 | - Имена процедур и функций: std/647.md 161 | - Структуры и таблицы значений в качестве параметров процедур и функций: std/640.md 162 | - Правила образования имен переменных: std/454.md 163 | - Работа с параметром "Отказ" в обработчиках событий: std/686.md 164 | - Использование конструкций встроенного языка: 165 | - Ограничение на использование оператора Перейти: std/547.md 166 | - Общие вопросы безопасности: 167 | - Безопасность прикладного программного интерфейса сервера: std/678.md 168 | - Ограничение на выполнение "внешнего" кода: std/669.md 169 | - Ограничения на использование внешних ресурсов: std/794.md 170 | - Проектирование интерфейсов: 171 | - Размеры экрана: std/727.md 172 | - Помочь: support.md 173 | -------------------------------------------------------------------------------- /docs/std/456.md: -------------------------------------------------------------------------------- 1 | ###### #std456 2 | 3 | # Тексты модулей 4 | 5 | ###### 1. 6 | 7 | Пишите код на русском языке. 8 | 9 | На английском языке можно писать имена веб-сервисов, названия их методов и параметров. 10 | Еще на английском можно писать название полей внешних структур данных. 11 | 12 | !!! quote "В стандарте не указано" 13 | 14 | Вместо обращений к полям внешних структур на английском лучше обращаться к ключам через строковые литералы. 15 | Так будет очевидно, что внешний ключ именно внешний. 16 | 17 | !!! failure "Неправильно" 18 | 19 | ```bsl 20 | Количество = Результат.Count; 21 | ``` 22 | 23 | !!! success "Правильно" 24 | 25 | ```bsl 26 | Количество = Результат["Count"]; 27 | ``` 28 | 29 | ###### 1.1. 30 | 31 | Не используйте букву `ё` в коде программы. 32 | Используйте `ё` в том, что выводится пользователю: текстах, справке, если без `ё` будет неправильное прочтение слова. 33 | 34 | !!! quote "В стандарте не указано" 35 | 36 | Если использовать букву `ё`, то очень сложно искать по кодовой базе. Придется искать во всех вариантах написания. 37 | 38 | [{==BSLLS:YoLetterUsage==}](../diagnostics/bslls/YoLetterUsage.md) 39 | 40 | ###### 1.2. 41 | 42 | Не используйте в коде программы неразрывные пробелы ` ` и знак минус `-` `−` в других начертаниях (короткое `–` `–`, длинное тире `—` `—`). 43 | 44 | При копировании текста из офисных документов такие символы часто оказываются в тексте модулей и приводят к проблемам: 45 | 46 | - Не работает поиск фрагментов текста 47 | - Ошибается подсказка типов параметров процедур и функций в конфигураторе и в 1С:EDT 48 | - Минуса в выражениях приводят к синтаксической ошибке 49 | 50 | ###### 2. 51 | 52 | Удаляйте мертвый код. Программа должна содержать только используемые процедуры и функции. Неиспользуемые - удалите. 53 | 54 | ###### 3. 55 | 56 | Удалите закомментированный код и код связанный с процессом разработки (отладочный код, служебные отметки: `TODO`, `MRG`). 57 | 58 | !!! failure "Неправильно" 59 | 60 | ```bsl 61 | Процедура ПередУдалением(Отказ) 62 | // Если Истина Тогда 63 | // Сообщение("Для отладки"); 64 | // КонецЕсли; 65 | КонецПроцедуры 66 | ``` 67 | 68 | !!! failure "Неправильно" 69 | 70 | ```bsl 71 | Процедура ПередУдалением(Отказ) 72 | Если Истина Тогда 73 | // Иванов: доделать 74 | КонецЕсли; 75 | КонецПроцедуры 76 | ``` 77 | 78 | !!! success "Правильно" 79 | 80 | Удалить обработчик **ПередУдалением** 81 | 82 | Не используйте комментарии в текстах запросов для патча запросов 83 | 84 | !!! failure "Неправильно" 85 | 86 | ```bsl 87 | ТекстЗапроса = 88 | "ВЫБРАТЬ 89 | | Контрагенты.Ссылка КАК Ссылка 90 | |// ПОМЕСТИТЬ Контрагенты 91 | |ИЗ 92 | | Справочник.Контрагенты КАК Контрагенты" 93 | ; 94 | 95 | Если ВыгрузитьВоВременнуюТаблицу Тогда 96 | ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "// ПОМЕСТИТЬ", "ПОМЕСТИТЬ"); 97 | КонецЕсли; 98 | ``` 99 | 100 | [#std437: Оформление текстов запросов](437.md) 101 | 102 | ###### 4. 103 | 104 | Пишите один оператор на одной строке. 105 | 106 | !!! success "Правильно" 107 | 108 | ```bsl 109 | НачальныйИндекс = 0; 110 | Индекс = 0; 111 | Результат = 0; 112 | ``` 113 | 114 | На одной строке несколько операторов можно писать для простых операторов присваивания 115 | 116 | !!! success "Сомнительно, но ОК" 117 | 118 | ```bsl 119 | НачальныйИндекс = 0; Индекс = 0; Результат = 0; 120 | ``` 121 | 122 | ###### 5. 123 | 124 | Код программы оформляйте отступом. Для отступа используется табуляция, а не пробелы. 125 | Размер табуляции: 4 символа. 126 | 127 | В конфигураторе можно сменить размер табуляции. Код надо оформлять так, чтобы при смене размера табуляции выравнивание сохранялось. 128 | 129 | ###### 5.1. 130 | 131 | С крайней левой позиции без отступов пишем: 132 | 133 | - операторы `#!bsl Процедура`, `#!bsl КонецПроцедуры`, `#!bsl Функция`, `#!bsl КонецФункции` 134 | - заголовки (описания) процедур и функций 135 | - объявление переменных модуля 136 | - код вне процедур и функций 137 | - директивы компилятора `#!bsl &НаКлиенте`, `#!bsl &НаСервере`... 138 | - аннотации `#!bsl &Перед`, `#!bsl &После`... 139 | - инструкции препроцессора `#!bsl #Если Сервер Тогда`, `#!bsl #Область`... 140 | 141 | !!! quote "В стандарте не указано" 142 | Автоматическое форматирование платформы не выравнивает директивы препроцессора по левому краю. 143 | После автоформатирования придется довыравнивать руками. 144 | 145 | ###### 5.2. 146 | 147 | Текст внутри блока процедур `#!bsl НачатьТранзакцию()` и `#!bsl ЗафиксироватьТранзакцию()` не сдвигается. 148 | 149 | ###### 6. 150 | 151 | Длина строки: 120 символов. 152 | Табуляция считается за 4 символа. 153 | 154 | Строки длиннее 120 пишутся только в случае, когда перенос невозможен. 155 | 156 | !!! quote "В стандарте не указано" 157 | 158 | Ограничение длины строк важно. Когда выполняем сравнение модулей, особенно для трехстороннего сравнения: 159 | приходится высматривать сразу три редактора кода. Даже широкие экраны не помогут при более 120 символах. 160 | 161 | [#std444: Перенос выражений](444.md) 162 | 163 | ###### 7.1. 164 | 165 | Тексты комментариев должны составляться: 166 | 167 | - по правилам русского языка 168 | - в деловом стиле 169 | - быть эмоционально сдержанными 170 | - не содержать слов, не относящихся к функциональности программы 171 | 172 | !!! quote "В стандарте не указано" 173 | 174 | Чтобы научиться писать хорошие комментарии прочитайте 175 | 176 | - :fontawesome-solid-book-bookmark: Роберт Мартин, Чистый код, Глава 4. Комментарии 177 | - :fontawesome-solid-book-bookmark: Стив Макконнелл, Совершенный код, Раздел 32. Самодокументирующийся код 178 | 179 | ###### 7.2. 180 | 181 | Небольшие комментарии пишите в конце строки 182 | 183 | !!! success "Правильно" 184 | 185 | ```bsl 186 | НайденныеОшибки.Колонки.Добавить("Номер"); // для совместимости 187 | ``` 188 | 189 | ###### 7.3. 190 | 191 | Большие комментарии или комментарии к фрагменту кода пишите перед кодом отдельной строкой. 192 | Текст выравнивайте по левому краю. 193 | Между символами комментария `#!bsl //` и началом комментария должен быть пробел. 194 | 195 | !!! success "Правильно" 196 | 197 | ```bsl 198 | // Инициализируем переменные для выполнения расчетов, 199 | // которые выполняются далее по тексту модуля. 200 | ТекущаяДата = ОбщегоНазначения.ПолучитьРабочуюДату(); 201 | ТекущийГод = Год(ТекущаяДата); 202 | ТекущийМесяц = Месяц(ТекущаяДата); 203 | ТекущаяНеделя = НеделяГода(ТекущаяДата); 204 | ТекущийДень = День(ТекущаяДата); 205 | ``` 206 | 207 | ###### 8. 208 | 209 | Тексты больших процедур и функций разбивайте на отдельные сворачиваемые области. 210 | Имена областей называются так же, как имена переменных из стандарта [правила образования имен переменных](454.md) 211 | 212 | ###### См. также 213 | 214 | - [#std469: Правила создания общих модулей](469.md) 215 | - [#std455: Структура модуля](455.md) 216 | 217 | ###### Источник 218 | 219 | https://its.1c.ru/db/v8std#content:456 220 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT 2 | PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT 3 | CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES 4 | THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO 5 | WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION 6 | OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES 7 | RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR 8 | WORKS PROVIDED HEREUNDER. 9 | 10 | Statement of Purpose 11 | 12 | The laws of most jurisdictions throughout the world automatically 13 | confer exclusive Copyright and Related Rights (defined below) upon the 14 | creator and subsequent owner(s) (each and all, an "owner") of an 15 | original work of authorship and/or a database (each, a "Work"). 16 | 17 | Certain owners wish to permanently relinquish those rights to a Work 18 | for the purpose of contributing to a commons of creative, cultural and 19 | scientific works ("Commons") that the public can reliably and without 20 | fear of later claims of infringement build upon, modify, incorporate 21 | in other works, reuse and redistribute as freely as possible in any 22 | form whatsoever and for any purposes, including without limitation 23 | commercial purposes. These owners may contribute to the Commons to 24 | promote the ideal of a free culture and the further production of 25 | creative, cultural and scientific works, or to gain reputation or 26 | greater distribution for their Work in part through the use and 27 | efforts of others. 28 | 29 | For these and/or other purposes and motivations, and without any 30 | expectation of additional consideration or compensation, the person 31 | associating CC0 with a Work (the "Affirmer"), to the extent that he or 32 | she is an owner of Copyright and Related Rights in the Work, 33 | voluntarily elects to apply CC0 to the Work and publicly distribute 34 | the Work under its terms, with knowledge of his or her Copyright and 35 | Related Rights in the Work and the meaning and intended legal effect 36 | of CC0 on those rights. 37 | 38 | 1. Copyright and Related Rights. A Work made available under CC0 may 39 | be protected by copyright and related or neighboring rights 40 | ("Copyright and Related Rights"). Copyright and Related Rights 41 | include, but are not limited to, the following: 42 | 43 | the right to reproduce, adapt, distribute, perform, display, 44 | communicate, and translate a Work; moral rights retained by the 45 | original author(s) and/or performer(s); publicity and privacy 46 | rights pertaining to a person's image or likeness depicted in a 47 | Work; rights protecting against unfair competition in regards to a 48 | Work, subject to the limitations in paragraph 4(a), below; rights 49 | protecting the extraction, dissemination, use and reuse of data in 50 | a Work; database rights (such as those arising under Directive 51 | 96/9/EC of the European Parliament and of the Council of 11 March 52 | 1996 on the legal protection of databases, and under any national 53 | implementation thereof, including any amended or successor version 54 | of such directive); and other similar, equivalent or corresponding 55 | rights throughout the world based on applicable law or treaty, and 56 | any national implementations thereof. 57 | 58 | 2. Waiver. To the greatest extent permitted by, but not in 59 | contravention of, applicable law, Affirmer hereby overtly, fully, 60 | permanently, irrevocably and unconditionally waives, abandons, and 61 | surrenders all of Affirmer's Copyright and Related Rights and 62 | associated claims and causes of action, whether now known or unknown 63 | (including existing as well as future claims and causes of action), in 64 | the Work (i) in all territories worldwide, (ii) for the maximum 65 | duration provided by applicable law or treaty (including future time 66 | extensions), (iii) in any current or future medium and for any number 67 | of copies, and (iv) for any purpose whatsoever, including without 68 | limitation commercial, advertising or promotional purposes (the 69 | "Waiver"). Affirmer makes the Waiver for the benefit of each member of 70 | the public at large and to the detriment of Affirmer's heirs and 71 | successors, fully intending that such Waiver shall not be subject to 72 | revocation, rescission, cancellation, termination, or any other legal 73 | or equitable action to disrupt the quiet enjoyment of the Work by the 74 | public as contemplated by Affirmer's express Statement of Purpose. 75 | 76 | 3. Public License Fallback. Should any part of the Waiver for any 77 | reason be judged legally invalid or ineffective under applicable law, 78 | then the Waiver shall be preserved to the maximum extent permitted 79 | taking into account Affirmer's express Statement of Purpose. In 80 | addition, to the extent the Waiver is so judged Affirmer hereby grants 81 | to each affected person a royalty-free, non transferable, non 82 | sublicensable, non exclusive, irrevocable and unconditional license to 83 | exercise Affirmer's Copyright and Related Rights in the Work (i) in 84 | all territories worldwide, (ii) for the maximum duration provided by 85 | applicable law or treaty (including future time extensions), (iii) in 86 | any current or future medium and for any number of copies, and (iv) 87 | for any purpose whatsoever, including without limitation commercial, 88 | advertising or promotional purposes (the "License"). The License shall 89 | be deemed effective as of the date CC0 was applied by Affirmer to the 90 | Work. Should any part of the License for any reason be judged legally 91 | invalid or ineffective under applicable law, such partial invalidity 92 | or ineffectiveness shall not invalidate the remainder of the License, 93 | and in such case Affirmer hereby affirms that he or she will not (i) 94 | exercise any of his or her remaining Copyright and Related Rights in 95 | the Work or (ii) assert any associated claims and causes of action 96 | with respect to the Work, in either case contrary to Affirmer's 97 | express Statement of Purpose. 98 | 99 | 4. Limitations and Disclaimers. 100 | 101 | No trademark or patent rights held by Affirmer are waived, 102 | abandoned, surrendered, licensed or otherwise affected by this 103 | document. Affirmer offers the Work as-is and makes no 104 | representations or warranties of any kind concerning the Work, 105 | express, implied, statutory or otherwise, including without 106 | limitation warranties of title, merchantability, fitness for a 107 | particular purpose, non infringement, or the absence of latent or 108 | other defects, accuracy, or the present or absence of errors, 109 | whether or not discoverable, all to the greatest extent 110 | permissible under applicable law. Affirmer disclaims 111 | responsibility for clearing rights of other persons that may apply 112 | to the Work or any use thereof, including without limitation any 113 | person's Copyright and Related Rights in the Work. Further, 114 | Affirmer disclaims responsibility for obtaining any necessary 115 | consents, permissions or other rights required for any use of the 116 | Work. Affirmer understands and acknowledges that Creative Commons 117 | is not a party to this document and has no duty or obligation with 118 | respect to this CC0 or use of the Work. -------------------------------------------------------------------------------- /docs/std/643.md: -------------------------------------------------------------------------------- 1 | ###### #std643 2 | 3 | # Работа в разных часовых поясах 4 | 5 | ###### 1. 6 | 7 | Сервер может работать в одном часовом поясе, пользователи в другом. Операции должны выполняться по местному времени пользователей. 8 | 9 | !!! example "Например" 10 | 11 | Сервер в Москве, пользователи во Владивостоке. Операции - по времени Владивостока. 12 | 13 | !!! quote "В стандарте не указано" 14 | 15 | Работа пользователей предполагается только из одного часового пояса. Сервер может быть не в том часовом поясе, что пользователи, но все пользователи должны быть в одном часовом поясе. Работа системы в случае, когда пользователи работают из разных часовых поясов, не стандартизирована. 16 | 17 | ###### 2.1. 18 | 19 | Используйте `#!bsl ТекущаяДатаСеанса` вместо `#!bsl ТекущаяДата` в серверном контексте. `#!bsl ТекущаяДатаСеанса` приводит время к часовому поясу пользовательского сеанса. `#!bsl ТекущаяДата` возвращает дату и время серверного компьютера. 20 | 21 | ###### 2.2. 22 | 23 | Когда требуется учесть время, не зависящее от часового пояса текущего сеанса пользователя, используйте `#!bsl УниверсальноеВремя`. 24 | 25 | !!! example "Например" 26 | 27 | Получить время последнего выполнения фонового задания или момента устаревания кеша. 28 | 29 | ###### 2.3. 30 | 31 | Если метод платформы возвращает время в часовом поясе сервера, а время надо показать пользователю, приведите время к часовому поясу пользователя. 32 | 33 | !!! success "Правильно" 34 | 35 | ```bsl 36 | ДатаАктуальностиУниверсальная = УниверсальноеВремя(ПолнотекстовыйПоиск.ДатаАктуальности()); 37 | ДатаАктуальности = МестноеВремя(ДатаАктуальностиУниверсальная, ЧасовойПоясСеанса()); 38 | ``` 39 | 40 | ###### 3.1. 41 | 42 | Не используйте `#!bsl ТекущаяДата` на клиенте. Это может привести к сложно расследуемому неожиданному поведению. 43 | 44 | Попробуйте вместо этого: 45 | 46 | - Передайте с сервера на клиент время и дату, приведенную к часовому поясу пользователя. 47 | - При работе с документами на клиенте используйте дату документа. 48 | 49 | ###### 3.2. 50 | 51 | !!! failure "Неправильно" 52 | 53 | ```bsl title="Определять месяц, который надо закрыть, получая дату с клиента" hl_lines="6" 54 | &НаКлиенте 55 | Процедура КомандаОткрытьЗакрытиеМесяца(Команда) 56 | 57 | ТекущиеДанные = Элементы.Список.ТекущиеДанные; 58 | Если ТекущиеДанные = Неопределено Тогда 59 | ТекДата = ТекущаяДата(); // вызов ТекущаяДата() на клиенте 60 | Иначе 61 | ТекДата = ТекущиеДанные.Дата; 62 | КонецЕсли; 63 | ПараметрыФормы = Новый Структура; 64 | ПараметрыФормы.Вставить("ПериодРегистрации", ТекДата); 65 | ОткрытьФорму("Обработка.ЗакрытиеМесяца.Форма.Форма", ПараметрыФормы, ЭтотОбъект); 66 | 67 | ... 68 | ``` 69 | ```bsl title="А при обработке использовать дату сервера" hl_lines="6" 70 | &НаСервере 71 | Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) 72 | 73 | ЗаполнитьЗначенияСвойств(Объект, Параметры); 74 | Если Не ЗначениеЗаполнено(Объект.ПериодРегистрации) Тогда 75 | Объект.ПериодРегистрации = НачалоМесяца(ТекущаяДата()); 76 | КонецЕсли; 77 | 78 | ... 79 | ``` 80 | 81 | !!! success "Правильно" 82 | 83 | ```bsl title="Определение даты переложить на сервер" hl_lines="6" 84 | &НаКлиенте 85 | Процедура КомандаОткрытьЗакрытиеМесяца(Команда) 86 | 87 | ТекущиеДанные = Элементы.Список.ТекущиеДанные; 88 | Если ТекущиеДанные = Неопределено Тогда 89 | ТекДата = Неопределено; // нет вызова ТекущаяДата() на клиенте 90 | Иначе 91 | ТекДата = ТекущиеДанные.Дата; 92 | КонецЕсли; 93 | ПараметрыФормы = Новый Структура; 94 | ПараметрыФормы.Вставить("ПериодРегистрации", ТекДата); 95 | ОткрытьФорму("Обработка.ЗакрытиеМесяца.Форма.Форма", ПараметрыФормы, ЭтотОбъект); 96 | 97 | ... 98 | ``` 99 | ```bsl title="При обработке использовать ТекущаяДатаСеанса" hl_lines="6" 100 | &НаСервере 101 | Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) 102 | 103 | ЗаполнитьЗначенияСвойств(Объект, Параметры); 104 | Если Не ЗначениеЗаполнено(Объект.ПериодРегистрации) Тогда 105 | Объект.ПериодРегистрации = НачалоМесяца(ТекущаяДатаСеанса()); 106 | КонецЕсли; 107 | 108 | ... 109 | ``` 110 | 111 | ###### 3.3. 112 | 113 | При работе с документами используйте дату документа вместо текущей даты. 114 | 115 | !!! failure "Неправильно" 116 | 117 | ```bsl title="Не передавайте текущую дату для подбора номенклатуры в табличную часть" hl_lines="5-6" 118 | &НаКлиенте 119 | Процедура ПодборТовары(Команда) 120 | 121 | ПараметрыПодбора = Новый Структура; 122 | ДатаРасчетов = ?(НачалоДня(Объект.Дата) = НачалоДня(ТекущаяДата()), Неопределено, Объект.Дата); // вызов ТекущаяДата() на клиенте 123 | ПараметрыПодбора.Вставить("ДатаРасчетов", ДатаРасчетов); 124 | ... 125 | ОткрытьФорму("Обработка.ПодборНоменклатуры.Форма.Форма", ПараметрыПодбора, 126 | ЭтотОбъект, УникальныйИдентификатор); 127 | 128 | ... 129 | ``` 130 | 131 | !!! success "Правильно" 132 | 133 | ```bsl title="Передавайте дату документа" hl_lines="5" 134 | &НаКлиенте 135 | Процедура ПодборТовары(Команда) 136 | 137 | ПараметрыПодбора = Новый Структура; 138 | ПараметрыПодбора.Вставить("ДатаРасчетов", Объект.Дата); 139 | 140 | ... 141 | ОткрытьФорму("Обработка.ПодборНоменклатуры.Форма.Форма", ПараметрыПодбора, 142 | ЭтотОбъект, УникальныйИдентификатор); 143 | 144 | ... 145 | ``` 146 | 147 | !!! failure "Неправильно" 148 | 149 | ```bsl title="Устанавливать отбор подобный условию: дата не больше переданной в форму" hl_lines="5-6" 150 | &НаКлиенте 151 | Процедура ЗачетАвансовДокументАвансаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) 152 | 153 | ПараметрыФормы = Новый Структура; 154 | ПараметрыФормы.Вставить("КонецПериода", 155 | ?(ЗначениеЗаполнено(Параметры.Ключ), Объект.Дата - 1, КонецДня(ТекущаяДата()))); // вызов ТекущаяДата() на клиенте 156 | ... 157 | ОткрытьФорму("Документ.ДокументРасчетовСКонтрагентом.ФормаВыбора", ПараметрыФормы, Элемент); 158 | ... 159 | ``` 160 | 161 | !!! success "Правильно" 162 | 163 | ```bsl title="Вычислять отбор по дате документа" hl_lines="5-6" 164 | &НаКлиенте 165 | Процедура ЗачетАвансовДокументАвансаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) 166 | 167 | ПараметрыФормы = Новый Структура; 168 | ПараметрыФормы.Вставить("КонецПериода", 169 | ?(ЗначениеЗаполнено(Параметры.Ключ), Объект.Дата - 1, КонецДня(Объект.Дата))); 170 | ... 171 | ОткрытьФорму("Документ.ДокументРасчетовСКонтрагентом.ФормаВыбора", ПараметрыФормы, Элемент); 172 | ... 173 | ``` 174 | 175 | ###### 3.4. 176 | 177 | При использовании БСП используйте `#!bsl ОбщегоНазначенияКлиент.ДатаСеанса` там, где не смогли отказаться от расчета даты на клиенте. 178 | 179 | ###### 4. 180 | 181 | Могут появиться исключения из правил, описанных выше. Если это произошло, оставьте в коде подробные комментарии, зачем это сделано: это поможет другим разработчикам, читающим ваш код, понять почему системы статического анализа выдают предупреждение на вашем коде. 182 | 183 | ###### 5. 184 | 185 | Не вызывайте подряд несколько раз функции `#!bsl ТекущаяДатаСеанса` (`#!bsl ТекущаяДата`). Возвращаемые значения будут отличаться - это может привести к ошибкам. 186 | 187 | !!! failure "Неправильно" 188 | 189 | ```bsl title="Рассчитывать дату каждый раз" hl_lines="2" 190 | ДатаПоследнегоОповещения = ТекущаяДатаСеанса(); 191 | ДатаСледующегоОповещения = РассчитатьДату() + ТекущаяДатаСеанса(); 192 | ``` 193 | 194 | !!! success "Правильно" 195 | 196 | ```bsl title="Использовать ранее рассчитанную дату" hl_lines="2" 197 | ДатаПоследнегоОповещения = ТекущаяДатаСеанса(); 198 | ДатаСледующегоОповещения = РассчитатьДату() + ДатаПоследнегоОповещения; 199 | ``` 200 | 201 | ###### Источник 202 | 203 | https://its.1c.ru/db/v8std#content:643 204 | -------------------------------------------------------------------------------- /docs/std/640.md: -------------------------------------------------------------------------------- 1 | ###### #std640 2 | 3 | # Параметры процедур и функций 4 | 5 | ###### 1. 6 | Параметры методов надо именовать так же, как переменные. 7 | 8 | См. [#std454: Правила образования имен переменных](454.md) 9 | 10 | ###### 2. 11 | Используйте параметры методов. 12 | Избегайте неявную передачу, такую как переменные модулей или реквизиты формы. 13 | 14 | ###### 3. 15 | Используйте порядок параметров: от общего к частному. 16 | 17 | !!! failure "Неправильно" 18 | 19 | ```bsl 20 | Процедура ПересчитатьСуммуДокумента(ИмяПоляСумма, ДокументОбъект, СуммаВключаетНДС = Истина) 21 | 22 | Процедура ПоменятьЦветПоляФормы(Цвет, ИмяПоля, Форма) 23 | ``` 24 | 25 | !!! success "Правильно" 26 | 27 | `#!bsl ДокументОбъект` и `#!bsl Форма` разместить впереди: 28 | 29 | ```bsl 30 | Процедура ПересчитатьСуммуДокумента(ДокументОбъект, ИмяПоляСумма, СуммаВключаетНДС = Истина) 31 | 32 | Процедура ПоменятьЦветПоляФормы(Форма, ИмяПоля, Цвет) 33 | ``` 34 | 35 | ###### 4. 36 | Необязательные параметры (параметров по-умолчанию) располагайте после обязательных. 37 | 38 | !!! success "Правильно" 39 | 40 | ```bsl 41 | Функция КурсВалютыНаДату(Валюта, Дата = Неопределено) Экспорт 42 | ``` 43 | 44 | ###### 5. 45 | 46 | Не делайте больше 7 параметров. 47 | Не делайте больше 3 необязательных параметров (параметров по-умолчанию). 48 | 49 | Вместо большого количества параметров: 50 | 51 | - группируйте похожие параметры в один типа `#!bsl Структура`, такие как `#!bsl ДанныеЗаполнения`, `#!bsl ПараметрыПроведения`, `#!bsl ДанныеФайла` 52 | - пересмотрите логику работы метода, разбейте логику на несколько методов 53 | 54 | !!! failure "Неправильно" 55 | 56 | ```bsl 57 | // Добавляет новое поле на форму, инициализирует его значениями по умолчанию. 58 | Функция ДобавитьПолеФормы(ИмяПоля, Заголовок = Неопределено, ОбработчикПриИзменении = "", ОбработчикНачалоВыбора = "", 59 | ШиринаПоля, ЦветФона = Неопределено, ЦветФонаЗаголовка = Неопределено, Родитель = Неопределено, 60 | КартинкаШапки = Неопределено, ПутьКДанным = Неопределено, ТолькоПросмотрПоля = Ложь, 61 | СвязиПараметровВыбора = Неопределено) 62 | … 63 | КонецФункции 64 | 65 | // вызывающий код 66 | НовоеПоле = ДобавитьПолеФормы("СтараяЦена", НСтр("ru='Цена'"),,, 12, ЦветФона, ЦветЗаголовка, НоваяГруппа,,,Истина); 67 | НовоеПоле.ЦветТекста = WebЦвета.Серый; 68 | ``` 69 | 70 | ```bsl 71 | // Создает элемент справочника "Номенклатура" 72 | Процедура СоздатьЭлементНоменклатуры(Наименование, ТоварУслуга, ЕдиницаИзмерения, ВесНетто, ПроверятьУникальность = Истина) 73 | … 74 | КонецПроцедуры 75 | ``` 76 | 77 | !!! success "Правильно" 78 | 79 | `#!bsl ИмяПоля` оставить как ключевой параметр, логику пересмотреть: 80 | 81 | ```bsl 82 | // Добавляет новое поле на форму, инициализирует его значениями по умолчанию. 83 | Функция НовоеПолеФормы(ИмяПоля) 84 | … 85 | КонецФункции 86 | 87 | // вызывающий код 88 | НовоеПоле = НовоеПолеФормы("СтараяЦена"); 89 | НовоеПоле.Заголовок = НСтр("ru='Цена'"); 90 | НовоеПоле.ЦветФона = ЦветФона; 91 | НовоеПоле.ЦветТекста = WebЦвета.Серый; 92 | НовоеПоле…. = … 93 | ``` 94 | 95 | ###### 6. 96 | Избегайте громоздких конструкций. 97 | 98 | ###### 6.1. 99 | Избегайте вложенные вызовы. Передавайте параметры явно. 100 | 101 | !!! failure "Неправильно" 102 | 103 | ```bsl 104 | СтруктураВложений.Вставить(ПрисоединенныйФайл.Наименование, 105 | Новый Картинка(ПолучитьИзВременногоХранилища( 106 | ПрисоединенныеФайлы.ПолучитьДанныеФайла(ПрисоединенныйФайл.Ссылка).СсылкаНаДвоичныеДанныеФайла))); 107 | ``` 108 | 109 | !!! success "Правильно" 110 | 111 | Разбивайте параметры с помощью логических переменных: 112 | 113 | ```bsl 114 | АдресФайлаИзображения = ПрисоединенныеФайлы.ПолучитьДанныеФайла(ПрисоединенныйФайл.Ссылка).СсылкаНаДвоичныеДанныеФайла; 115 | ДанныеИзображения = Новый Картинка(ПолучитьИзВременногоХранилища(АдресФайлаИзображения)); 116 | СтруктураВложений.Вставить(ПрисоединенныйФайл.Наименование, ДанныеИзображения); 117 | ``` 118 | 119 | Чувствуете легкость и компактность? Оставьте как есть! 120 | ```bsl 121 | Предупреждение(НСтр("ru='Для выполнения операции необходимо установить расширение работы с файлами.'")); 122 | 123 | ПеречитатьСуммуПоКурсу(Сумма, КурсВалютыНаДату(Валюта)); 124 | ``` 125 | 126 | ###### 6.2. 127 | Избегайте вложенные конструкторы. 128 | Вложенные структуры создавайте только если свойств структуры 3 и меньше. 129 | 130 | !!! failure "Неправильно" 131 | 132 | ```bsl 133 | ЗаполнитьЦены(Объект.Товары, , 134 | Новый Структура("Дата, Валюта, Соглашение, ПоляЗаполнения", Объект.Дата, Объект.Валюта, Объект.Соглашение, "Цена, СтавкаНДС, ВидЦены, СрокПоставки"), 135 | Новый Структура("ПересчитатьСумму, ПересчитатьСуммуСНДС, ПересчитатьСуммуНДС, ПересчитатьСуммуРучнойСкидки, ОчиститьАвтоматическуюСкидку, 136 | ОчиститьСуммуВзаиморасчетов", "КоличествоУпаковок", СтруктураПересчетаСуммы, СтруктураПересчетаСуммы, 137 | "КоличествоУпаковок", Неопределено, Неопределено)); 138 | ``` 139 | 140 | !!! success "Правильно" 141 | 142 | ```bsl 143 | ПараметрыЗаполнения = Новый Структура; 144 | ПараметрыЗаполнения.Вставить("Дата", Объект.Дата); 145 | ПараметрыЗаполнения.Вставить("Валюта", Объект.Валюта); 146 | ПараметрыЗаполнения.Вставить("Соглашение", Объект.Соглашение); 147 | ПараметрыЗаполнения.Вставить("ПоляЗаполнения", "Цена, СтавкаНДС, ВидЦены, СрокПоставки"); 148 | 149 | ДействияСИзмененнымиСтроками = Новый Структура; 150 | ДействияСИзмененнымиСтроками.Вставить("ПересчитатьСумму","КоличествоУпаковок"); 151 | ДействияСИзмененнымиСтроками.Вставить("ПересчитатьСуммуСНДС", ПараметрыПересчетыСуммы); 152 | ДействияСИзмененнымиСтроками.Вставить("ПересчитатьСуммуНДС", ПараметрыПересчетыСуммы); 153 | ДействияСИзмененнымиСтроками.Вставить("ПересчитатьСуммуРучнойСкидки","КоличествоУпаковок"); 154 | ДействияСИзмененнымиСтроками.Вставить("ОчиститьАвтоматическуюСкидку"); 155 | ДействияСИзмененнымиСтроками.Вставить("ОчиститьСуммуВзаиморасчетов "); 156 | 157 | ЗаполнитьЦены(Объект.Товары, ПараметрыЗаполнения, ДействияСИзмененнымиСтроками); 158 | ``` 159 | 160 | ###### 6.3. 161 | Избегайте лишних пробелов: 162 | 163 | - перед открывающей скобкой 164 | - после открывающей скобки 165 | - перед закрывающей скобкой 166 | - перед запятыми 167 | 168 | !!! failure "Неправильно" 169 | 170 | ```bsl 171 | НовоеПоле = НовоеПолеФормы ( ИмяПоля , ТипПоля ); 172 | ``` 173 | 174 | !!! success "Правильно" 175 | 176 | ```bsl 177 | НовоеПоле = НовоеПолеФормы(ИмяПоля, ТипПоля); 178 | ``` 179 | 180 | !!! quote "В стандарте не указано" 181 | 182 | Полную формулировку __"перед запятыми при размещении параметров в одной строке и если параметры не опущены"__ можно трактовать как разрешения писать слитно запятые у необязательных параметров 183 | 184 | ```bsl 185 | Форма = ПолучитьФорму(ИмяФормы, , , , , , Параметр); 186 | Форма = ПолучитьФорму(ИмяФормы,,,,,, Параметр); 187 | ``` 188 | 189 | равносильно допустимы 190 | 191 | ###### 7. 192 | При вызове методов не пропускайте обязательные параметры. 193 | Пропущенный обязательный параметр получит значение `#!bsl Неопределено`, а метод может не уметь с ним работать. 194 | 195 | Для вызова методы: 196 | ```bsl 197 | Процедура ПоменятьЦветПоляФормы(Форма, ИмяПоля, Цвет) 198 | ``` 199 | 200 | !!! failure "Неправильно" 201 | 202 | ```bsl 203 | ПоменятьЦветПоляФормы(,"РезультатПроверки", ЦветаСтиля.ПоясняющийОшибкуТекст); // пропущен первый параметр Форма 204 | ПоменятьЦветПоляФормы(,,); // пропущены все обязательные параметры 205 | ``` 206 | 207 | !!! success "Правильно" 208 | 209 | ```bsl 210 | ПоменятьЦветПоляФормы(ЭтотОбъект, "РезультатПроверки", Цвет); // указаны все обязательные параметры 211 | ``` 212 | 213 | ###### См. также 214 | 215 | - :fontawesome-solid-book-bookmark: СОВЕРШЕННЫЙ КОД Стив Макконнелл ГЛАВА 7. Высококачественные методы 216 | - :fontawesome-solid-book-bookmark: ЧИСТЫЙ КОД Роберт Мартин ГЛАВА 3. Функции 217 | - :fontawesome-solid-book-bookmark: Чистый дизайн Кент Бек ГЛАВА 8. Пояснительные переменные 218 | - :fontawesome-solid-book-bookmark: Чистый дизайн Кент Бек ГЛАВА 10. Явная передача параметров 219 | - [Передача параметров по ссылке и по значению при вызове процедур и функций](https://its.1c.ru/db/metod8dev/content/2606/hdoc) 220 | - [Руководство разработчика 4.7.4. Передача параметров процедур и функций](https://its.1c.ru/db/v8327doc#bookmark:dev:ti000000151) 221 | - [#std641: Структуры и таблицы значений в качестве параметров процедур и функций](641.md) 222 | 223 | ###### Источник 224 | 225 | https://its.1c.ru/db/v8std#content:640 226 | -------------------------------------------------------------------------------- /docs/std/669.md: -------------------------------------------------------------------------------- 1 | ###### #std669 2 | 3 | # Ограничение на выполнение "внешнего" кода 4 | 5 | Внешний код может быть подключен с помощью: 6 | 7 | - внешних отчетов 8 | - внешних обработок 9 | - расширений конфигурации 10 | - внешних компонент 11 | - другими способами (какими?) 12 | 13 | Внешний код может содержать деструктивные действия: 14 | 15 | - в самом коде выполнить действие 16 | - запустить внешнее приложение 17 | - внешнюю компоненту 18 | - создать COM-объект 19 | 20 | Пример уязвимости [Информация для пользователей и партнеров №21537 от 22.06.2016](https://1c.ru/news/info.jsp?id=21537) 21 | 22 | ###### 1. 23 | Запрещено выполнение на сервере в небезопасном режиме любого кода, который не является частью программы. 24 | 25 | Запускать можно код, прошедший аудит. 26 | Или код на клиенте. 27 | 28 | !!! example "Например" 29 | 30 | - внешние отчеты и обработки, расширения, внешние компоненты, любые аналоги подключения внешнего кода 31 | - алгоритмы на встроенном языке, тексты запросов и фрагменты текстов запросов, используемые в методах `#!bsl Выполнить` и `#!bsl Вычислить`. См. [#std770: Ограничения на использование Выполнить и Вычислить на сервере](770.md) 32 | - изменение схем компоновки данных, в которых разрешено использование внешних функций, а так же загрузку схем компоновки данных из файлов 33 | 34 | При использовании БСП внешний код надо подключать только средствами БСП: 35 | 36 | - расширения - через механизм базовой функциональности 37 | - внешние отчеты и обработки - через подсистему "Дополнительные отчеты и обработки" 38 | - внешние компоненты - через подсистуму "Внешние компоненты" 39 | - для запуска внешних программ - См. [#std774: Безопасность запуска приложений](774.md) 40 | 41 | ###### 2. 42 | 43 | По умолчанию требуется отключить интерактивное открытие внешних отчетов и обработок через меню __Файл - Открыть__. В том числе у администратора. 44 | 45 | См. пп. 2.2 и 2.3 [#std488: Стандартные роли](488.md) 46 | 47 | Администратор может разрешить интерактивное открытие. 48 | 49 | !!! example "При интерактивном открытии надо уведомлять об опасности действия" 50 | ![Пример предупреждения из БСП](669.alert1.png){ width="600" } 51 | 52 | ###### 3. 53 | 54 | Предупреждайте администратора об опасности подключения любого внешнего кода. 55 | 56 | ###### 3.1. 57 | 58 | Предупреждение должно содержать: 59 | 60 | !!! quote "Цитата" 61 | 62 | Внешний код, полученный из недостоверных источников (с которыми, например, нет договоренности о разработке такого кода), может нанести вред компьютерам пользователей, серверным компьютерам, а также данным в программе. 63 | 64 | Дайте возможность администратору прервать загрузку, провести аудит, а потом заново повторить загрузку. 65 | 66 | !!! example "При загрузке расширения" 67 | ![Предупреждение при загрузке расширения](669.alert2.png){ width="500" } 68 | 69 | !!! example "При загрузке дополнительной обработки" 70 | ![Предупреждение при загрузке дополнительной обработки](669.alert3.png){ width="500" } 71 | 72 | !!! example "При загрузке внешней компоненты" 73 | ![Предупреждение при загрузке внешней компоненты](669.alert4.png){ width="500" } 74 | 75 | ###### 3.2. 76 | 77 | Подключенный администратором внешний код другие пользователи могут использовать без предупреждений. 78 | 79 | Механизм защиты от опасных действий платформы во всех случаях отключать запрещено. 80 | 81 | [Руководство разработчика 7.10.2. Отключение механизма защиты от опасных действий](https://its.1c.ru/db/v8327doc/bookmark/dev/ti000001873) 82 | 83 | ###### 4. 84 | Средства обновления конфигурации (из файлов .cf или .cfu), средства восстановления из резервной копии или загрузки из dt-файла 85 | 86 | - должны быть доступны только администратору 87 | - должно выполняться только интерактивно 88 | - администратору надо показать предупреждение 89 | - при получении обновления из сети Интернет, надо использовать защищенное соединение 90 | 91 | ###### 5. 92 | 93 | Произвольные файлы могут содержать вредоносный код. 94 | 95 | Предусмотрите блокировку загрузки файлов по списку разрешенных (запрещенных) расширений. 96 | 97 | Открывать исполняемые файлы из программы запрещено. Даже если их разрешено загрузить и хранить в программе. 98 | 99 | Вредоносный код может содержаться в макросах Microsoft Office. При работе с такими файлами используйте средства безопасности, заложенные в их программы просмотра. См [#std775: Безопасность программного обеспечения, вызываемого через открытые интерфейсы](775.md) 100 | 101 | Используйте БСП подсистему "Работа с файлами". 102 | 103 | ###### 6. 104 | Безопасность внешних компонент. 105 | 106 | ###### 6.1. 107 | Внешние компоненты можно размещать: 108 | 109 | - в макетах конфигурации - они являются частью конфигурации 110 | - сторонние - они потенциально опасны 111 | 112 | Сторонние внешние компоненты, предназначенные для подключения на сервере, устанавливать должен только администратор. 113 | 114 | Внешние компоненты, предназначенные для подключения на клиенте, устанавливать может любой пользователь, с показом предупреждения. 115 | 116 | ###### 6.2. 117 | Сторонние внешние компоненты должны храниться в специальном справочнике. 118 | Запись в такой справочник должен иметь только администратор. 119 | Подключать сторонние внешние компоненты допустимо только по навигационной ссылке на реквизит справочника. 120 | 121 | Не подключайте сторонние внешние компоненты по имени файла или по идентификатору программы. Так компоненту легко подменить. 122 | 123 | ###### 6.3. 124 | Внешние компоненты в составе конфигурации должены хранится в макетах типа "Внешняя компонента". Макет не локализуется. Компоненты должны локализовываться через интерфейс компоненты. 125 | 126 | ###### 6.4. 127 | Используйте БСП для подключение внешних компонент. 128 | 129 | !!! failure "Неправильно" 130 | 131 | ```bsl 132 | ПодключитьВнешнююКомпоненту(...) 133 | НачатьУстановкуВнешнейКомпоненты(...) 134 | УстановитьВнешнююКомпоненту(...) 135 | НачатьПодключениеВнешнейКомпоненты(...) 136 | ЗагрузитьВнешнююКомпоненту(...) 137 | ``` 138 | 139 | !!! example "Для подключения компоненты из макета" 140 | ```bsl 141 | ОбщегоНазначенияКлиент.ПодключитьКомпонентуИзМакета 142 | ``` 143 | 144 | !!! example "Для подключения компоненты из макета на сервере" 145 | ```bsl 146 | ОбщегоНазначения.ПодключитьКомпонентуИзМакета 147 | ``` 148 | 149 | !!! example "Для подключения компонент из хранилища внешних компонент" 150 | ```bsl 151 | ВнешниеКомпонентыКлиент.ПодключитьКомпоненту 152 | ``` 153 | 154 | !!! example "Для подключения компонент из хранилища внешних компонент на сервере" 155 | ```bsl 156 | ВнешниеКомпоненты.ПодключитьКомпоненту 157 | ``` 158 | 159 | ###### 7. 160 | Загружать код из внешнего удаленного источника следует: 161 | 162 | - если источник надежен, когда ему доверяем 163 | - только по защищенным каналам 164 | - защищенный канал должен быть с проверкой подлинности сервера 165 | 166 | !!! example "Пример установки защищенного соединения с проверной подлинности сервера" 167 | ```bsl 168 | ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(, Новый СертификатыУдостоверяющихЦентровОС); 169 | Соединение = Новый HTTPСоединение(Сервер,,,,,, ЗащищенноеСоединение); 170 | ``` 171 | 172 | Вне зависимости от протокола и типа канала, канал должен быть защищенным: `#!bsl HTTPСоединение`, `#!bsl FTPСоединение`, `#!bsl WSПрокси`, `#!bsl WSОпределения`, `#!bsl WSСсылкаМенеджер.СоздатьWSПрокси`. 173 | 174 | !!! example "В БСП есть конструктор защищенного соединения" 175 | ```bsl 176 | ЗащищенноеСоединение = ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение(); 177 | Соединение = Новый HTTPСоединение(Сервер,,,,,, ЗащищенноеСоединение); 178 | ``` 179 | 180 | ###### 8. 181 | Регламентные задания по-умолчанию запускаются под полными правами. 182 | Установка безопасного режима не уменьшает прав пользователя. 183 | 184 | Ограничивайте права в сеансе регламантного задания. Для этого программно создайте и укажите служебного пользователя. 185 | 186 | Стратегии ограничения прав: 187 | 188 | - пустой список ролей, вычисления без прав, чтение и изменение выполнять в привилегированном режиме установленном вручную, исполнение произвольного кода производить в безопасном режиме 189 | - назначить реального пользователя (для одноразовых заданий ок) 190 | - создавать специальный профиль и специальные роли для чтения таблиц 191 | 192 | Для БСП в подсистеме "Регламентные задания" в начале обработчика регламентного задания разместите код: 193 | 194 | !!! example "В БСП есть установка служебного пользователя" 195 | ```bsl 196 | РегламентныеЗаданияСервер.УстановитьСлужебногоПользователяРегламентногоЗадания 197 | ``` 198 | 199 | 200 | ###### См. также 201 | 202 | - [#std770: Ограничения на использование Выполнить и Вычислить на сервере](770.md) 203 | - [Облачные технологии](https://v8.1c.ru/platforma/oblachnye-tehnologii/) 204 | - [#std678: Безопасность прикладного программного интерфейса сервера](678.md) 205 | - [#std485: Использование привилегированного режима](485.md) 206 | 207 | ###### Источник 208 | 209 | https://its.1c.ru/db/v8std#content:669 210 | -------------------------------------------------------------------------------- /docs/std/783.md: -------------------------------------------------------------------------------- 1 | ###### #std783 2 | 3 | # Транзакции: правила использования 4 | 5 | Транзакция - это действие, которое может быть выполнено только целиком. Если часть действия не выполнена - все действие отменяется. 6 | 7 | ###### 1. 8 | 9 | Ошибка `В этой транзакции уже происходили ошибки` возникает из-за несоблюдения требований к написанию кода. Такие ошибки сложно воспроизводить и отлаживать их исправление. 10 | 11 | Особенности работы с транзакциями в платформе: 12 | 13 | - Не поддерживаются вложенные транзакции ([Вложенность транзакций](https://its.1c.ru/db/metod8dev/content/2334)). 14 | - Если в транзакции возникло исключение транзакция может не завершится, даже если перехватить это исключение [Ошибки базы данных и транзакции](https://its.1c.ru/db/metod8dev/content/2313), [Особенности работы объектов при отмене транзакции](https://its.1c.ru/db/v8std#content:783). 15 | - Платформа может начинать транзакции сама. Это называется неявные транзакции. [Глава 9.2. Механизм транзакций](https://its.1c.ru/db/v83doc/bookmark/dev/TI000000527). 16 | 17 | ###### 1.1. 18 | 19 | Исключение не отменяет транзакцию. Оно взводит служебный флажок транзакции `Запрет успешного завершения`. Реальная отмена произойдет тогда, когда код дойдет до функции `#!bsl ЗафиксироватьТранзакцию` или `#!bsl ОтменитьТранзакцию`. 20 | Для каждого метода `#!bsl НачатьТранзакцию` должны быть парные методы `#!bsl ЗафиксироватьТранзакцию` и `#!bsl ОтменитьТранзакцию`. 21 | 22 | !!! quote "В стандарте не указано" 23 | 24 | О том что такое флажки транзакции и как работает платформа смотрите в: 25 | 26 | - :fontawesome-solid-book-bookmark: Профессиональная разработка в системе 1С Предприятие, Том 1, стр 107-108 27 | - [Ошибки базы данных и транзакции](https://its.1c.ru/db/metod8dev/content/2313). 28 | - [Глава 9.2.3. Вложенный вызов транзакций](https://its.1c.ru/db/v83doc#bookmark:dev:TI000000529) 29 | - [:fontawesome-brands-youtube:{ .youtube } YouTube: Транзакции и блокировки: как их готовить программисту 1С?](https://www.youtube.com/watch?v=egJOPTDAgUQ) 30 | 31 | ###### 1.2. 32 | 33 | Начало транзакции и ее завершение (фиксацию) выполняйте в одном методе. Не должно быть разнесения начала и конца на несколько функций. Тот, кто будет расследовать ошибку, скажет спасибо! 34 | 35 | !!! failure "Неправильно" 36 | 37 | ```bsl 38 | Процедура ЗаписатьДанныеВИБ() 39 | 40 | НачатьТранзакцию(); 41 | ЗаписатьДокумент(); 42 | 43 | КонецПроцедуры; 44 | 45 | Процедура ЗаписатьДокумент() 46 | 47 | Попытка 48 | ... // чтение или запись данных 49 | ДокументОбъект.Записать() 50 | ЗафиксироватьТранзакцию(); 51 | Исключение 52 | ОтменитьТранзакцию(); 53 | ... // дополнительные действия по обработке исключения 54 | КонецПопытки; 55 | 56 | КонецПроцедуры 57 | ``` 58 | 59 | !!! success "Правильно" 60 | 61 | ```bsl 62 | Процедура ЗаписатьДанныеВИБ() 63 | 64 | НачатьТранзакцию(); 65 | Попытка 66 | ... // чтение или запись данных 67 | ДокументОбъект.Записать() 68 | ЗафиксироватьТранзакцию(); 69 | Исключение 70 | ОтменитьТранзакцию(); 71 | ... // дополнительные действия по обработке исключения 72 | КонецПопытки; 73 | 74 | КонецПроцедуры 75 | ``` 76 | 77 | ###### 1.3. 78 | 79 | Используйте следующий паттерн для работы с транзакциями: 80 | 81 | !!! tip "Паттерн" 82 | 83 | ```bsl 84 | НачатьТранзакцию(); // (1) 85 | Попытка 86 | БлокировкаДанных = Новый БлокировкаДанных; 87 | ЭлементБлокировкиДанных = БлокировкаДанных.Добавить("Документ.ПриходнаяНакладная"); 88 | ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", СсылкаДляОбработки); 89 | ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; 90 | БлокировкаДанных.Заблокировать(); 91 | 92 | ... // чтение или запись данных (2) 93 | 94 | ДокументОбъект.Записать(); 95 | 96 | ЗафиксироватьТранзакцию(); // (3) 97 | Исключение 98 | ОтменитьТранзакцию(); // (4) 99 | 100 | ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции'"), // (5) 101 | УровеньЖурналаРегистрации.Ошибка, 102 | , 103 | , 104 | ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); 105 | 106 | ВызватьИсключение; // (6) 107 | КонецПопытки; 108 | ``` 109 | 110 | 1. Метод `#!bsl НачатьТранзакцию` должен быть вне блока `#!bsl Попытка-Исключение` перед оператором `#!bsl Попытка` и ничего между ними; 111 | 112 | 2. Все действия, выполняемые после метода `#!bsl НачатьТранзакцию`, должны находиться в одном блоке `#!bsl Попытка`, в том числе чтение, блокировка и обработка данных; 113 | 114 | 3. Метод `#!bsl ЗафиксироватьТранзакцию` должен идти последним в блоке `#!bsl Попытка` перед оператором `#!bsl Исключение`, чтобы гарантировать, что после `#!bsl ЗафиксироватьТранзакцию` не возникнет исключение; 115 | 116 | 4. До обработки исключений в блоке `#!bsl Исключение` сначала вызовите метод `#!bsl ОтменитьТранзакцию`, а затем выполняйте другие действия, если они требуются; 117 | 118 | 5. В блоке `#!bsl Исключение` делайте запись в журнал регистрации; 119 | 120 | 6. В конце блока `#!bsl Исключение` добавляйте оператор `#!bsl ВызватьИсключение`. В противном случае исключение не будет передано выше по стеку вызовов, там не сработает обработка исключения, внешняя транзакция не будет отменена и платформа вызовет исключение `В данной транзакции происходила ошибка`. 121 | 122 | ###### 1.4. 123 | 124 | Если можно избежать использования вложенных транзакций - постарайтесь избежать. 125 | 126 | ###### 1.4.1. 127 | 128 | Не вызывайте `#!bsl НачатьТранзакцию` если кроме записи объекта других действий не требуется. Платформа сделает все неявно сама, а читать код станет сложнее. 129 | 130 | Избегайте открытия транзакции, если не требуется ответственное чтение данных #std648. Например, при записи нового объекта или набора записей регистра обычно ответственное чтение не требуется. 131 | 132 | При вызове методов `#!bsl ПолучитьОбъект` (или `#!bsl Прочитать` для наборов записей) анализируйте должно ли происходить чтение ответственно. Если не должно - не вызывайте `#!bsl НачатьТранзакцию`. 133 | 134 | !!! failure "Неправильно" 135 | 136 | ```bsl 137 | НачатьТранзакцию(); 138 | Попытка 139 | ДокументОбъект = Документы.ПриходнаяНакладная.СоздатьДокумент(); 140 | ... // действия по заполнению объекта 141 | ДокументОбъект.Записать(); 142 | ЗафиксироватьТранзакцию(); 143 | Исключение 144 | ОтменитьТранзакцию(); 145 | КонецПопытки; 146 | ``` 147 | 148 | !!! success "Правильно" 149 | 150 | ```bsl 151 | Попытка 152 | ДокументОбъект = Документы.ПриходнаяНакладная.СоздатьДокумент(); 153 | ... // действия по заполнению объекта 154 | ДокументОбъект.Записать(); 155 | Исключение 156 | ... // действия по обработке исключения 157 | КонецПопытки; 158 | ``` 159 | 160 | ###### 1.4.2. 161 | 162 | Если вы разрабатываете метод, который предназначен только для вызова из событий `#!bsl ПередЗаписью`, `#!bsl ОбработкаПроведения` и т.п., не открывайте внутри метода транзакций. Они гарантированно будут вложенными. 163 | 164 | !!! quote "В стандарте не указано" 165 | 166 | Имеет смысл добавить проверку, гарантирующую, что метод выполняется внутри транзакции, или описать это формально в описании к методу. 167 | 168 | ```bsl 169 | Если Не ТранзакцияАктивна() Тогда 170 | ВызватьИсключение НСтр("ru = 'Метод предназначен для вызова внутри транзакции.'"); 171 | КонецЕсли; 172 | ``` 173 | 174 | ###### 1.4.3. 175 | 176 | Для детализации сообщений об ошибках предусмотрите свою обработку исключений. Так текст исключений можно сделать понятнее. 177 | 178 | !!! quote "В стандарте не указано" 179 | 180 | С развитием [механизма отображения ошибок](https://wonderland.v8.1c.ru/blog/razvitie-mekhanizma-otobrazheniya-oshibok/) скорее всего подход будет изменен. 181 | 182 | ###### 1.4.4. 183 | 184 | Не обращайтесь к базе данных, пока активна транзакция, в которой возникло исключение. Это приведет к ошибке вида `В этой транзакции уже происходили ошибки`. Помните о неявных обращениях, например для получения представления ссылки. 185 | 186 | ###### 2. 187 | 188 | Не делайте транзакции длинными. 189 | 190 | ###### 2.1. 191 | 192 | Выполняйте вместе только неделимые операции с точки зрения бизнес-логики. 193 | 194 | !!! example "Например" 195 | 196 | При проведении документа записывается документ и его движения в регистрах. Если не прошла запись хотя бы в один регистр вся операция проведения должна быть отменена. 197 | 198 | ###### 2.1.1. 199 | 200 | Не объединяйте в одну транзакцию такие действия, которые с точки зрения бизнес-логики могут быть выполнены раздельно. 201 | 202 | ###### 2.1.2. 203 | 204 | Исключения: 205 | 206 | - Обработать несколько несвязных объектов вместе можно для оптимизации скорости работы. Надо правильно подобрать порции. Стремиться достигнуть золотую середину между длительностью одной транзакции и объемом фиксируемых данных с одной стороны и количеством транзакций с другой стороны. 207 | 208 | ###### 2.2. 209 | 210 | Избегайте транзакций, которые выполняются долго. 211 | 212 | !!! failure "Неправильно" 213 | 214 | При загрузке адресного классификатора записывать все данные, относящиеся к одной версии классификатора в одной транзакции. В случае ошибки откатить целиком загружаемую версию классификатора. 215 | 216 | Данных по одной версии классификатора много (объем около 1 Гб). Для выполнения такой транзакции, 217 | 218 | - может не хватить оперативной памяти (особенно при использовании файловой информационной базы на 32-разрядной ОС) 219 | - такая операция будет выполняться достаточно долго и ее не получится оптимизировать за счет выполнения в несколько потоков 220 | 221 | !!! success "Правильно" 222 | 223 | Разбить загрузку новой версии классификатора на небольшие транзакции и реализовать функциональность по откату к предыдущей версии в случае ошибки. 224 | 225 | - См. [Особенности использования транзакций при обмене данными](https://its.1c.ru/db/metod8dev/content/2274/hdoc) 226 | 227 | ###### 2.2.1. 228 | 229 | Чем дольше выполняется транзакция, тем большее время будут заняты ресурсы сервера и СУБД. 230 | 231 | Долгий захват ресурсов снизит эффективность работы системы: 232 | 233 | - журнал транзакций: в него пишутся все изменения в базе данных, выполненные в транзакции, чтобы их правильно отменить; 234 | - блокировки, установленные внутри транзакции, будут действовать до конца транзакции; 235 | - на сервере блокировки занимают оперативную память; 236 | - другие ресурсы, необходимые бизнес-логике, которая выполняет транзакцию. 237 | 238 | ###### 2.2.2. 239 | 240 | Если транзакция пересеклась по блокировкам с другой транзакцией, она будет ждать возможности установить блокировку. Время ожидания по умолчанию - 20 секунд. Когда время ожидания истекло, транзакция будет завершена с исключением `Превышено время ожидания установки блокировки`. 241 | 242 | Поэтому длинные транзакции снижают удобство параллельной работы нескольких пользователей. 243 | 244 | Проведите анализ, обращая внимание на следующее: 245 | 246 | - возможно, какие-то действия можно вынести за транзакцию [2.1.1](#211); 247 | - постарайтесь оптимизировать алгоритм выполнения действия; 248 | - проанализируйте оптимальность устанавливаемых блокировок 249 | 250 | ###### 2.3. 251 | 252 | Выполняйте вместе только неделимые операции с точки зрения бизнес-логики. 253 | 254 | !!! quote "В стандарте не указано" 255 | 256 | Дополняет [2.1.](#21) 257 | 258 | - сложные, ресурсоемкие расчеты нужно стремиться делать до начала транзакции, если это позволяет бизнес-логика; 259 | - если расчет должен выполняться в транзакции, то нужно стремиться сделать его как можно более простым; 260 | 261 | !!! example "Например" 262 | Контроль остатков можно делать уже после записи простым запросом к записываемому регистру; 263 | 264 | - проверка заполнения объекта должна делаться вне транзакции (см. Проверки, выполняемые в и вне транзакции записи объекта #std463); 265 | - запросы, перед выполнением которых не нужно устанавливать блокировку данных, нужно стремиться выполнять до начала транзакции (см. Ответственное чтение данных #std648); 266 | - запросы, выполняемые в рамках транзакций нужно стремиться оптимизировать (см. группу стандартов Оптимизация запросов) 267 | 268 | ###### Источник 269 | 270 | https://its.1c.ru/db/v8std#content:783 271 | -------------------------------------------------------------------------------- /docs/std/455.md: -------------------------------------------------------------------------------- 1 | ###### #std455 2 | 3 | # Структура модуля 4 | 5 | ###### 1.1. 6 | 7 | Старайтесь выделить из модуля следующие разделы: 8 | 9 | - заголовок модуля; 10 | - раздел описания переменных; 11 | - экспортные процедуры и функции модуля, составляющие его программный интерфейс; 12 | - обработчики событий объекта (формы); 13 | - служебные процедуры и функции модуля; 14 | - раздел инициализации переменных. 15 | 16 | Некоторые разделы могут присутствовать только в модулях определенного вида. Например, обработчики событий элементов форм могут присутствовать только в модулях форм, а раздел описания переменных и раздел инициализации не могут быть определены в неглобальных общих модулях, модулях менеджеров объектов, наборов записей, значений констант и модуле сеанса. 17 | 18 | 19 | Помогите другим разработчикам понять ваш код. Так будет проще ориентироваться всем. Ведь ты будешь заранее знать где и что искать. Как в типовой, так и в доработанной конфигурации. 20 | 21 | ###### 1.2. 22 | 23 | Не делайте очень большие разделы, разделяйте на подразделы. Так будет проще ориентироваться в коде. 24 | 25 | ###### 1.3. 26 | 27 | Разделы и подразделы оформляйте в виде областей. Называйте области так же, как и переменные. См. [#std454: Правила образования имен переменных](454.md). 28 | 29 | ###### 1.4. 30 | 31 | Шаблон общего модуля: 32 | 33 | !!! tip "Паттерн" 34 | 35 | ```bsl title="русск." 36 | #Область ПрограммныйИнтерфейс 37 | // Код процедур и функций (1) 38 | #КонецОбласти 39 | 40 | #Область СлужебныйПрограммныйИнтерфейс 41 | // Код процедур и функций (2) 42 | #КонецОбласти 43 | 44 | #Область СлужебныеПроцедурыИФункции 45 | // Код процедур и функций (3) 46 | #КонецОбласти 47 | ``` 48 | 49 | 1. Содержит экспортные процедуры и функции для использования другими объектами конфигурации или другими программами (например, через внешнее соединение). 50 | 51 | 2. Содержит экспортные процедуры и функции для модулей этой же библиотеки. В нем размещайте экспортные процедуры и функции, которые допустимо вызывать только из других подсистем этой же библиотеки. 52 | 53 | 3. Содержит внутреннюю реализацию общего модуля.

Если общий модуль это часть некоторой подсистемы, здесь допустимо размещать служебные экспортные процедуры и функции, предназначенные только для вызова из других объектов данной подсистемы. 54 | 55 | ```bsl title="англ." 56 | #Region Public 57 | // Enter code here. 58 | #EndRegion 59 | 60 | #Region Internal 61 | // Enter code here. 62 | #EndRegion 63 | 64 | #Region Private 65 | // Enter code here. 66 | #EndRegion 67 | ``` 68 | 69 | Для больших модулей разбивайте на подразделы по функциональности: 70 | 71 | !!! example "Пример" 72 | 73 | ```bsl title="русск." 74 | #Область ОбновлениеИнформационнойБазы 75 | // Код процедур и функций 76 | #КонецОбласти 77 | ``` 78 | 79 | ```bsl title="англ." 80 | #Region InfobaseUpdate 81 | // Enter code here. 82 | #EndRegion 83 | ``` 84 | 85 | ###### 1.5. 86 | 87 | Шаблон модулей объектов, менеджеров, наборов записей, обработок, отчетов: 88 | 89 | !!! tip "Паттерн" 90 | 91 | ```bsl title="русск." 92 | #Область ОписаниеПеременных 93 | 94 | #КонецОбласти 95 | 96 | #Область ПрограммныйИнтерфейс 97 | // Код процедур и функций (1) 98 | #КонецОбласти 99 | 100 | #Область ОбработчикиСобытий 101 | // Код процедур и функций (2) 102 | #КонецОбласти 103 | 104 | #Область СлужебныйПрограммныйИнтерфейс 105 | // Код процедур и функций (3) 106 | #КонецОбласти 107 | 108 | #Область СлужебныеПроцедурыИФункции 109 | // Код процедур и функций (4) 110 | #КонецОбласти 111 | 112 | #Область Инициализация 113 | 114 | #КонецОбласти 115 | ``` 116 | 117 | 1. Содержит экспортные процедуры и функции для использования в других модулях конфигурации или другими программами (например, через внешнее соединение).

Не помещайте сюда методы, которые нужны только для вызова из модулей самого объекта, его форм и команд.

Например, процедуры заполнения табличной части документа, вызываемые из обработки заполнения в модуле объекта или из формы документа в обработчике команды формы - **не являются программным интерфейсом модуля объекта**. Они вызываются только в самом модуле и из форм этого же объекта. Размещайте их в разделе `Служебные процедуры и функции`. 118 | 119 | 2. Содержит обработчики событий модуля объекта `#!bsl ПриЗаписи`, `#!bsl ПриПроведении` и др. 120 | 121 | 3. Такое же предназначение, как и в общих модулях [1.4.](#14) 122 | 123 | 4. Такое же предназначение, как и в общих модулях [1.4.](#14) 124 | 125 | ```bsl title="англ." 126 | #Region Variables 127 | 128 | #EndRegion 129 | 130 | #Region Public 131 | // Enter code here. 132 | #EndRegion 133 | 134 | #Region EventHandlers 135 | // Enter code here. 136 | #EndRegion 137 | 138 | #Region Internal 139 | // Enter code here. 140 | #EndRegion 141 | 142 | #Region Private 143 | // Enter code here. 144 | #EndRegion 145 | 146 | #Region Initialize 147 | 148 | #EndRegion 149 | ``` 150 | 151 | ###### 1.6. 152 | 153 | Шаблон модулей форм: 154 | 155 | !!! tip "Паттерн" 156 | 157 | ```bsl title="русск." 158 | #Область ОписаниеПеременных 159 | 160 | #КонецОбласти 161 | 162 | #Область ОбработчикиСобытийФормы 163 | // Код процедур и функций (1) 164 | #КонецОбласти 165 | 166 | #Область ОбработчикиСобытийЭлементовШапкиФормы 167 | // Код процедур и функций (2) 168 | #КонецОбласти 169 | 170 | #Область ОбработчикиСобытийЭлементовТаблицыФормы<ИмяТаблицыФормы> 171 | // Код процедур и функций (3) 172 | #КонецОбласти 173 | 174 | #Область ОбработчикиКомандФормы 175 | // Код процедур и функций (4) 176 | #КонецОбласти 177 | 178 | #Область СлужебныеПроцедурыИФункции 179 | // Код процедур и функций (5) 180 | #КонецОбласти 181 | ``` 182 | 183 | 1. Содержит обработчики событий формы: `#!bsl ПриСозданииНаСервере`, `#!bsl ПриОткрытии` и др. 184 | 185 | 2. Содержит обработчики событий элементов, расположенных в основной части формы, которые не связаны с таблицами на форме. 186 | 187 | 3. Таких разделов может быть несколько. Для каждой таблицы свой раздел. Для обработчиков таблиц формы и элементов формы. 188 | 189 | 4. Для обработчиков команд формы. 190 | 191 | 5. Такое же предназначение, как и в общих модулях [1.4.](#14) 192 | 193 | ```bsl title="англ." 194 | #Region Variables 195 | 196 | #EndRegion 197 | 198 | #Region FormEventHandlers 199 | // Enter code here. 200 | #EndRegion 201 | 202 | #Region FormHeaderItemsEventHandlers 203 | // Enter code here. 204 | #EndRegion 205 | 206 | #Region FormTableItemsEventHandlers 207 | // Enter code here. 208 | #EndRegion 209 | 210 | #Region FormCommandsEventHandlers 211 | // Enter code here. 212 | #EndRegion 213 | 214 | #Region Private 215 | // Enter code here. 216 | #EndRegion 217 | ``` 218 | 219 | ###### 1.7. 220 | 221 | Шаблон модулей команд: 222 | 223 | !!! tip "Паттерн" 224 | 225 | ```bsl title="русск." 226 | #Область ОбработчикиСобытий 227 | // Код процедур и функций (1) 228 | #КонецОбласти 229 | 230 | #Область СлужебныеПроцедурыИФункции 231 | // Код процедур и функций (2) 232 | #КонецОбласти 233 | ``` 234 | 235 | 1. Содержит обработчик команды: `#!bsl ОбработкаКоманды`. 236 | 237 | 2. Такое же предназначение, как и в общих модулях [1.4.](#14) 238 | 239 | 240 | ```bsl title="англ." 241 | #Region EventHandlers 242 | // Enter code here. 243 | #EndRegion 244 | 245 | #Region Private 246 | // Enter code here. 247 | #EndRegion 248 | ``` 249 | 250 | ###### 1.8. 251 | 252 | Не оставляйте пустых областей в модуле. 253 | 254 | ###### 2.1. 255 | 256 | Модуль может содержать заголовок модуля с описанием состава модуля. Описывайте в заголовке модулей форм параметры формы. 257 | 258 | !!! example "Пример" 259 | 260 | ```bsl title="русск." 261 | //////////////////////////////////////////////////////////////////////////////// 262 | // Клиентские процедуры и функции общего назначения: 263 | // - для работы со списками в формах; 264 | // - для работы с журналом регистрации; 265 | // - для обработки действий пользователя в процессе редактирования 266 | // многострочного текста, например комментария в документах; 267 | // - прочее. 268 | // 269 | //////////////////////////////////////////////////////////////////////////////// 270 | ``` 271 | 272 | ###### 2.2. 273 | 274 | Пример описания переменных: 275 | 276 | !!! example "Пример" 277 | 278 | ```bsl title="русск." 279 | #Область ОписаниеПеременных 280 | 281 | Перем ВалютаУчета; 282 | Перем АдресПоддержки; 283 | ... 284 | 285 | #КонецОбласти 286 | ``` 287 | 288 | ```bsl title="англ." 289 | #Region Variables 290 | 291 | Var PresentationCurrency; 292 | Var SupportEmail; 293 | ... 294 | 295 | #EndRegion 296 | ``` 297 | 298 | Все переменные в разделе глобальных переменных модуля должны быть прокомментированы. Комментировать лучше в той же строке, где объявлена переменная. 299 | 300 | - См. [#std454: Правила образования имен переменных](454.md) 301 | - См. [#std639: Использование переменных в программных модулях](639.md) 302 | 303 | ###### 2.3. 304 | 305 | Программный интерфейс располагается сразу после описания переменных. Так методы будет проще найти тем, кто открыл модуль впервые. 306 | 307 | - См. [#std453 Описание процедур и функций](453.md) 308 | 309 | ###### 2.4.1. 310 | 311 | Обработчики событий формы, команд и элементов формы располагайте до служебных методов. Читать код приятнее когда можно читать сверху вниз. 312 | 313 | ###### 2.4.2. 314 | 315 | Старайтесь обработчики одного элемента формы располагать рядом. Придерживайтесь порядка следования в панели редактора формы. 316 | 317 | ###### 2.4.3. 318 | 319 | Для каждого события создавайте свой обработчик. 320 | 321 | Если одинаковые действия ожидаются для событий разных элементов, то: 322 | 323 | - Создайте отдельную процедуру, выполняющую действие. 324 | - Для каждого элемент формы создайте свой обработчик с именем по умолчанию. 325 | - В каждом обработчике вызовите общую процедуру. 326 | 327 | !!! failure "Неправильно" 328 | 329 | ```bsl 330 | &НаКлиенте 331 | Процедура ПоИсполнителюПриИзменении(Элемент) 332 | 333 | ПараметрыОтбора = Новый Соответствие(); 334 | ПараметрыОтбора.Вставить("ПоАвтору", ПоАвтору); 335 | ПараметрыОтбора.Вставить("ПоИсполнителю", ПоИсполнителю); 336 | УстановитьОтборСписка(Список, ПараметрыОтбора); 337 | 338 | КонецПроцедуры 339 | 340 | &НаКлиенте 341 | Процедура ПоАвторуПриИзменении(Элемент) 342 | 343 | ПоИсполнителюПриИзменении(Неопределено); 344 | 345 | КонецПроцедуры 346 | ``` 347 | 348 | !!! success "Правильно" 349 | 350 | ```bsl 351 | &НаКлиенте 352 | Процедура ПоИсполнителюПриИзменении(Элемент) 353 | 354 | УстановитьОтбор(); 355 | 356 | КонецПроцедуры 357 | 358 | &НаКлиенте 359 | Процедура ПоАвторуПриИзменении(Элемент) 360 | 361 | УстановитьОтбор(); 362 | 363 | КонецПроцедуры 364 | 365 | &НаСервере 366 | Процедура УстановитьОтбор() 367 | 368 | ПараметрыОтбора = Новый Соответствие(); 369 | ПараметрыОтбора.Вставить("ПоАвтору", ПоАвтору); 370 | ПараметрыОтбора.Вставить("ПоИсполнителю", ПоИсполнителю); 371 | УстановитьОтборСписка(Список, ПараметрыОтбора); 372 | 373 | КонецПроцедуры 374 | ``` 375 | 376 | Не вызывайте процедуры обработчики из кода напрямую. Оставьте их вызов только платформе. Смешение сценариев вызова неоправдано усложняет логику работы и в один прекрасный момент программа может стать очень сложной и развалиться. 377 | 378 | ###### 2.5. 379 | 380 | Обработчики событий модулей объекта и менеджера объекта размещайте после раздела с программным интерфейсом, но до служебных процедур и функций модуля. 381 | 382 | ###### 2.5.1. 383 | 384 | Располагайте обработчики в модулях объекта и менеджера по порядку следования в описании встроенного языка. 385 | 386 | ###### 2.6. 387 | 388 | Служебные процедуры и функции модуля размещайте в модуле следом за обработчиками событий. 389 | 390 | Если общий модуль это часть некоторой подсистемы, здесь допустимо размещать служебные экспортные процедуры и функции, предназначенные только для вызова из других объектов данной подсистемы. 391 | 392 | Методы, связанные между собой по характеру или по логике работы, располагайте рядом. 393 | 394 | Не группируйте методы по месту исполнения, как на серверные, клиентские, функции без контекста. Такое упорядочивание усложняет понимание логики модуля отвлекая разработчика от ее реализации. 395 | 396 | ###### 2.7. 397 | 398 | Пример инициализации переменных: 399 | 400 | !!! example "Пример" 401 | 402 | ```bsl title="русск." 403 | #Область Инициализация 404 | 405 | АдресПоддержки = "v8@1c.ru"; 406 | ВыполнитьИнициализацию(); 407 | ... 408 | 409 | #КонецОбласти 410 | ``` 411 | 412 | ```bsl title="англ." 413 | #Region Initialize 414 | 415 | SupportEmail = "v8@1c.ru"; 416 | Ctor(); 417 | ... 418 | 419 | #EndRegion 420 | ``` 421 | 422 | ###### Источник 423 | 424 | https://its.1c.ru/db/v8std#content:455 425 | --------------------------------------------------------------------------------