diff --git a/docs/theory/data_blocking.md b/docs/theory/data_blocking.md index 134b116..550012c 100644 --- a/docs/theory/data_blocking.md +++ b/docs/theory/data_blocking.md @@ -10,14 +10,47 @@ title: Блокировки #### Что такое блокировка? **Блокировка данных** — механизм, обеспечивающий конкурентный доступ пользователей к информационной базе и целостность данных при одновременных изменениях. Она предотвращает конфликты, когда несколько пользователей пытаются изменить одни и те же данные. +**Простой аналог:** +Продавец блокирует яблоко для покупателя, пока тот отсчитывает деньги. Другие покупатели не могут выбрать это яблоко до завершения операции. + #### Проблемы, которые решают блокировки: 1. **Потерянное изменение** — когда изменения одной транзакции перезаписываются другой + + ```bsl + // Транзакция A: // Транзакция B: + Остаток = 100 Остаток = 100 + Остаток = Остаток - 10 = 90 Остаток = Остаток - 20 = 80 + Записать(90) Записать(80) // Затерло 90! + ``` + 2. **"Грязное" чтение** — чтение незафиксированных данных + + ```bsl + // Транзакция A: // Транзакция B параллельно: + ИзменитьСумму(1000 → 2000) Сумма = ПрочитатьСумму() // =2000! + ОтменитьТранзакциюА() // Работа с некорректным значением + ``` + 3. **Неповторяемое чтение** — разные результаты при повторном чтении тех же данных + + ```bsl + // Транзакция A: // Транзакция B: + Сумма = Прочитать() // =1000 // Параллельно: + Изменить(1000 → 2000) + Сумма = Прочитать() // =2000! + ``` + 4. **Чтение фантомов** — появление новых данных между чтениями (актуально для необъектных сущностей, например, регистры сведений и накопления) -#### Простой аналог: -Продавец блокирует яблоко для покупателя, пока тот отсчитывает деньги. Другие покупатели не могут выбрать это яблоко до завершения операции. + ```bsl + // Транзакция A (регистр сведений, упрощенный пример): + ВсегоЗаписей = КоличествоЗаписей() // =100 + + // Транзакция Б добавляет новую запись + ДобавитьЗаписьВРегистр() + + ВсегоЗаписей = КоличествоЗаписей() // =101! + ``` ## Типы блокировок в 1С @@ -95,7 +128,7 @@ title: Блокировки | **Фантомы** | ✅ Возможно | ✅ Возможно | ✅ Возможно | ❌ Запрещено | | **Параллельность** | Высокая | Средняя | Низкая | Очень низкая | -**Read Committed Snapshot (RCSI)**: Режим версионирования, поддерживается в PostgreSQL, Oracle и MS SQL (с 8.3). Нет ожиданий на блокировках при чтении т.к если другая транзакция пишет данные, ваш запрос не ждет, а читает "старый снимок" данных, которые были до начала записи. **Рекомендуется включать** для MS SQL в управляемом режиме. +**Read Committed Snapshot (RCSI)**: Режим версионирования, поддерживается в PostgreSQL, Oracle и MS SQL (с 8.3). Нет ожиданий на блокировках при чтении т.к если другая транзакция пишет данные, ваш запрос не ждет, а читает "старый снимок" данных, которые были до начала записи. **Рекомендуется включать** для 8.2 или 8.3 в режиме совместимости с 8.2. #### Сравнение Read Committed vs Read Committed Snapshot @@ -252,15 +285,6 @@ title: Блокировки **Решение**: Делите большие операции на пакеты (по 1000-2000 записей). -#### Рекомендации по оптимизации -1. ✅ Перейти на **управляемый режим** блокировок -2. ✅ Включить **RCSI (Read Committed Snapshot)** для MS SQL -3. ✅ Включить **разделитель итогов** для регистров без контроля остатков -4. ✅ Использовать **Запрос** вместо `НаборЗаписей.Прочитать()` для чтения -5. ✅ Делать **транзакции короткими** -6. ✅ Использовать **многопоточность** для массовых операций -7. ✅ **Мониторить** блокировки специальными инструментами - ## Механизмы контроля остатков в типовых конфигурациях #### Два механизма контроля остатков @@ -290,14 +314,42 @@ title: Блокировки **Симптом**: Две транзакции ждут друг друга. **Причины**: +- Недостаточный уровень изоляции + + Транзакции считывают данные под разделяемой блокировкой (S), а затем пытаются обновить их, что требует установки монопольной блокировки (X). + + Если две транзакции одновременно удерживают S-блокировки на одних и тех же ресурсах и запрашивают X-блокировки для их изменения, возникает взаимоблокировка. + - Неоптимальный порядок блокировок + + Пример: Два документа — «Поступление товаров» и «Реализация товаров» — при проведении обращаются к одним и тем же виртуальным таблицам регистров, но порядок вызова методов записи различен: + + ```bsl + // Поступление товаров + // 1. 🔒 Сначала блокируются ОстаткиНаСкладах + ОстаткиНаСкладах.Записать(); + + // 2. Потом пробуем блокировать ОстаткиОрганизаций, но уже заблокировано реализацией, ожидаем... + ОстаткиОрганизаций.Записать(); + ``` + + ```bsl + // Реализация товаров + // 1. 🔒 Сначала блокируются ОстаткиОрганизаций + ОстаткиОрганизаций.Записать(); + + // 2. Потом пробуем блокировать ОстаткиНаСкладах, но уже заблокировано поступлением, ожидаем... + ОстаткиНаСкладах.Записать(); + ``` + + При параллельном проведении таких документов высока вероятность взаимоблокировки, так как каждая транзакция удерживает блокировку на одном ресурсе и ожидает освобождения другого. + - Длительные транзакции -- Отсутствие индексов **Решение**: +- Блокировка в транзакции должна изначально осуществляться с максимально необходимым уровнем - Устанавливать блокировки в одинаковом порядке - Делать транзакции короткими -- Использовать правильные индексы #### Ожидания на блокировках @@ -368,7 +420,7 @@ title: Блокировки * [Ответственное чтение данных](https://its.1c.ru/db/v8std#content:648:hdoc) -* [Блокировка данных объекта для редактирования из кода](https://its.1c.ru/db/v8std/content/490/hdoc) +* [Блокировка данных объекта для редактирования из кода](https://its.1c.ru/db/v8std/content/490/hdoc) * [Ускорение в 100 раз. Решаем проблему блокировок](https://infostart.ru/1c/articles/629017/) diff --git a/docs/theory/forms.md b/docs/theory/forms.md index 8522180..0d38e2b 100644 --- a/docs/theory/forms.md +++ b/docs/theory/forms.md @@ -152,56 +152,51 @@ title: Управляемые формы ## Ответы на ключевые вопросы #### 1. Где установить признак видимости у существующего объекта без проверки на новый объект? -**Ответ:** В обработчике `ПриЧтенииНаСервере`. Этот обработчик вызывается только для существующих объектов, и здесь можно безопасно устанавливать видимость элементов. +В обработчике `ПриЧтенииНаСервере`. Этот обработчик вызывается только для существующих объектов, и здесь можно безопасно устанавливать видимость элементов. #### 2. Во что сериализуется ДанныеФормыКоллекции? -**Ответ:** В XML. Все данные формы (включая коллекции) сериализуются в XML для передачи между клиентом и сервером. +В XML. Все данные формы (включая коллекции) сериализуются в XML для передачи между клиентом и сервером. #### 3. Какую переменную нужно использовать для обращения на клиенте и на сервере для постоянных значений? -**Ответ:** Реквизиты формы. Они доступны и на клиенте, и на сервере, сохраняются на время жизни формы. +Реквизиты формы. Они доступны и на клиенте, и на сервере, сохраняются на время жизни формы. #### 4. Переменные модуля формы? -**Ответ:** - `&НаКлиенте` переменные: существуют с создания до закрытия формы, только на клиенте - `&НаСервере` переменные: существуют только во время выполнения серверной процедуры, уничтожаются после возврата на клиент -#### 5. Параметры формы для чего используются? -**Ответ:** +#### 5. Параметры формы для чего используются? - Для создания формы (передача начальных данных) - Для уникальности формы (ключевые параметры) - Различают: системные, ключевые (для уникальности), обычные (только при создании) #### 6. Мы находимся в обработчике событий "ПриСозданииНаСервере" модуля формы. Необходимо обратиться к реквизиту объекта, который имеет тип "ХранилищеЗначения". Как это сделать? -**Ответ:** Использовать `РеквизитФормыВЗначение()` для преобразования данных формы в прикладной объект, затем работать с его реквизитами. +Использовать `РеквизитФормыВЗначение()` для преобразования данных формы в прикладной объект, затем работать с его реквизитами. #### 7. Необходимо создать форму списка, где выводится информация из периодического регистра сведений только самые последние значения на текущую дату. Где и как это можно сделать? Два варианта. -**Ответ:** 1. В качестве таблицы динамического списка указать регистр среза последних 2. В обработчике `ПриСозданииНаСервере` настроить отбор динамического списка на срез последних #### 8. На форме есть элемент. Необходимо, чтобы по умолчанию видимость была установлена в "Ложь" и пользователь мог включить видимость в пользовательском режиме через "Еще→Изменить форму". Как это сделать? -**Ответ:** Установить свойству "ПользовательскаяВидимость" значение "Истина". Это позволит пользователям управлять видимостью через настройки формы. +Установить свойству "ПользовательскаяВидимость" значение "Истина". Это позволит пользователям управлять видимостью через настройки формы. #### 9. Есть форма, она открывает вторую форму. Во второй форме мы получаем таблицу значений, необходимо данную таблицу значений передать в первую форму, как это сделать? -**Ответ:** С использованием временного хранилища. Сохранить таблицу во временное хранилище во второй форме и при закрытии передать идентификатор в первую форму. +С использованием временного хранилища. Сохранить таблицу во временное хранилище во второй форме и при закрытии передать идентификатор в первую форму. #### 10. В модуле формы поместили во временное хранилище таблицу значений, необходимо, чтобы хранилище было удалено, если форму закроют. Как это сделать? -**Ответ:** Указать уникальный идентификатор формы при помещении в хранилище, или использовать обработчик `ПриЗакрытии` для очистки хранилища. +Указать уникальный идентификатор формы при помещении в хранилище, или использовать обработчик `ПриЗакрытии` для очистки хранилища. #### 11. Какие обработчики событий в модуле формы включены в транзакции записи? -**Ответ:** `ПриЗаписиНаСервере` выполняется внутри транзакции записи объекта. +`ПриЗаписиНаСервере` выполняется внутри транзакции записи объекта. #### 12. Отличия ключевых параметров формы от обычных? -**Ответ:** - **Ключевые параметры:** существуют все время жизни формы, определяют уникальность формы - **Обычные параметры:** существуют только в момент создания формы - **Системные параметры:** предопределены платформой #### 13. Какой тип имеет объект на форме? -**Ответ:** `ДанныеФормыСтруктура` — набор свойств произвольного типа, представляющий прикладной объект в форме. +`ДанныеФормыСтруктура` — набор свойств произвольного типа, представляющий прикладной объект в форме. #### 14. Чем отличается Объект от ТекущийОбъект в событиях? -**Ответ:** - **Объект:** реквизит формы типа `ДанныеФормыСтруктура` - **ТекущийОбъект:** настоящий прикладной объект (например, `СправочникОбъект.Номенклатура`) @@ -212,23 +207,20 @@ title: Управляемые формы - `ПослеЗаписиНаСервере`: `ТекущийОбъект` изменять бессмысленно, данные уже в `Объект` #### 15. Для чего служит флажок реквизита управляемой формы "Основной реквизит"? -**Ответ:** 1. Изменяет поведение формы — стандартные команды работают в контексте типа основного реквизита 2. Изменяет контекст модуля формы — дополняется свойствами и методами типа основного реквизита #### 16. Что нужно сделать, чтобы при открытии управляемой формы списка справочника курсор сразу стоял на нужной строке списка? -**Ответ:** Передать в параметр "Параметры" метода `ОткрытьФорму()` структуру: `Новый Структура("ТекущаяСтрока", НужнаяСсылка)` +Передать в параметр "Параметры" метода `ОткрытьФорму()` структуру: `Новый Структура("ТекущаяСтрока", НужнаяСсылка)` #### 17. Как реализовать отображение и поведение поля как гиперссылки в ячейке табличной части управляемой формы? -**Ответ:** 1. У нужного элемента установить флаги: "Гиперссылка" и "ГиперссылкаЯчейки" 2. Обработать нажатие в событии таблицы формы "Выбор" #### 18. В чем опасность изменения видимости элемента на клиенте? -**Ответ:** Изменение видимости может потребовать обращения к серверу для пересчета расположения элементов, что снижает производительность. +Изменение видимости может потребовать обращения к серверу для пересчета расположения элементов, что снижает производительность. #### 19. Для чего используют ключевое слово `Знач` в параметрах метода? - 1. **Оптимизация трафика** (главная причина) - Параметры с `Знач` **не возвращаются на клиент** после серверного выполнения - Экономия на двойной сериализации больших объектов diff --git a/docs/theory/index_types.md b/docs/theory/index_types.md index 0466b62..6aa14db 100644 --- a/docs/theory/index_types.md +++ b/docs/theory/index_types.md @@ -20,7 +20,7 @@ title: Индексы | **Аналог** | Оглавление книги (порядок страниц = содержание) | Алфавитный указатель в конце книги | | **Кол-во** | 1 на таблицу | Много на таблицу | | **Скорость** | Максимальная (данные сразу там) | Высокая, но требует перехода по ссылке (найти запись в индексе, затем по ссылке перейти к данным) | -| **Что хранит** | Сами строки данных (таблица отсортирована) | Копия ключевых полей + ссылка на строку. Существует отдельно от данных. Сам индекс хранится в одном месте, а данные — в другом | +| **Что хранит** | Сами строки данных (таблица отсортирована) | Копия ключевых полей + ссылка на строку. Существует отдельно от данных. Сам индекс хранится в одном месте в виде b-дерева, а данные — в другом | | **Влияние** | Меняет физический порядок хранения | Не меняет физический порядок | **Простая аналогия**: diff --git a/docs/theory/metadata/accounting_registers.md b/docs/theory/metadata/accounting_registers.md new file mode 100644 index 0000000..7f249b4 --- /dev/null +++ b/docs/theory/metadata/accounting_registers.md @@ -0,0 +1,71 @@ +--- +sidebar_position: 28 +sidebar_label: Регистры бухгалтерии +title: Регистры бухгалтерии +--- +**Регистры бухгалтерии** — объекты для ведения **многомерного аналитического учета** по плану счетов с поддержкой двойной записи и субконто. + +## Ключевые понятия + +**Субконто** — аналитические разрезы учета (Склады, Контрагенты, Номенклатура). Настраиваются в плане счетов для каждого счета. Cубконто связаны с планом видов характеристик. + +**Корреспонденция** — режим работы регистра: с двойной записью (СчетДт/СчетКт) или без (единая запись). Проводки без поддержки корреспонденции характерны для международного. + +**Балансовый признак** — контроль равенства значений измерений/ресурсов в дебете и кредите. Отключается для операций между разными объектами (валютные переводы между организациями). + +## Виртуальные таблицы и их особенности + +| Таблица | Назначение | Особенности использования | +|---|---|---| +| **Остатки** | Получение остатков на дату | Учитывает начальные остатки и все движения до указанной даты | +| **Обороты** | Получение оборотов за период | Только движения за указанный период, без остатков | +| **ОстаткиИОбороты** | Получение остатков на начало и оборотов за период | Основная таблица для отчетов. **Параметр `МетодДополнения`** — управляет показом счетов без оборотов, но с остатками | +| **ДвиженияССубконто** | Получение проводок с детализацией по субконто | Соединение основной таблицы и таблицы субконто. **Включает все записи, даже неактивные**. Используется для отборов проводок | +| **ОборотыДтКт** | Получение оборотов с корреспонденцией счетов | Только для регистров с включенной корреспонденцией | + +## Субконто в виртуальных таблицах + +**Когда появляются:** +Субконто появляются в виртуальных таблицах при выполнении **двух условий**: +1. В **плане счетов** для конкретного счета настроены типы субконто (например, Склад, Номенклатура) +2. В **регистре бухгалтерии** включено соответствующее количество субконто (больше 0) + +**Как работают:** +- В таблицах **Остатки**, **Обороты**, **ОстаткиИОбороты** субконто становятся **дополнительными измерениями** +- В таблице **ДвиженияССубконто** субконто представлены как отдельные записи + +## Ответы на ключевые вопросы + +#### 1. Отличие от регистров накопления +**Вопрос:** *Чем регистр бухгалтерии отличается от регистра накопления?* +**Ответ:** +- **Привязка к плану счетов** — обязательная связь с конкретным планом счетов +- **Субконто** — многоуровневая аналитика через план видов характеристик +- **Корреспонденция** — поддержка двойной записи (Дт/Кт) +- **Балансовый контроль** — проверка равенства сумм по дебету и кредиту + +#### 2. Работа с субконто +**Вопрос:** *Как настроить субконто для счета?* +**Ответ:** +1. В **плане счетов** открыть свойства нужного счета +2. В разделе **"Субконто"** добавить типы субконто (Склады, Контрагенты и т.д.) +3. В **регистре бухгалтерии** проверить количество включенных субконто + +#### 3. Параметр `МетодДополнения` +**Вопрос:** *Зачем нужен параметр `МетодДополнения`?* +**Ответ:** +Управляет включением в результат записей **без оборотов за период, но с остатками**. + +#### 4. Таблица `ДвиженияССубконто` +**Вопрос:** *Когда использовать `ДвиженияССубконто` вместо `Остатки`?* +**Ответ:** +Использовать `ДвиженияССубконто` когда нужно: +- Получить **детальные проводки** с развернутыми субконто +- Сделать **отбор по значениям субконто** (например, все операции по конкретному контрагенту) +- Увидеть **все записи**, включая неактивные (сторнированные) + +#### 5. Балансовый признак +**Вопрос:** *В каком сценарии отключают балансовый признак у измерения?* +**Ответ:** +При **валютных операциях между разными организациями**. +Пример: Перевод валюты из ОрганизацииА в ОрганизациюБ. В дебете — ОрганизацияА, в кредите — ОрганизацияБ. Без отключения балансового признака система выдаст ошибку. diff --git a/docs/theory/metadata/accumulation_registers.md b/docs/theory/metadata/accumulation_registers.md index 4e6892a..3c002d2 100644 --- a/docs/theory/metadata/accumulation_registers.md +++ b/docs/theory/metadata/accumulation_registers.md @@ -3,7 +3,7 @@ sidebar_position: 27 sidebar_label: Регистры накопления title: Регистры накопления --- -**Регистры накопления** — объекты для учета движения и накопления числовых данных в многомерных разрезах (товары, деньги, материалы). Есть два вида: **остатков** (сохраняет остатки) и **оборотов** (только изменения). +**Регистры накопления** — объекты для учета движения и накопления числовых данных в многомерных разрезах (товары, деньги, материалы). Есть два вида: **остатков** и **оборотов**. ## Ключевые моменты @@ -31,10 +31,14 @@ title: Регистры накопления 3. **Досчитает** по движениям с этой даты до нужной (15.12.2023) 4. Если итогов нет → считает полностью по движениям -### Таблица "Обороты" +#### Алгоритм получения оборотов - Для регистра **остатков**: всегда работает по **таблице движений** (не использует итоги) - Для регистра **оборотов**: использует **таблицу итогов**, если параметры совпадают, а иначе по **таблице движений** +#### Алгоритм получения остатков и оборотов для таблицы `ОстаткиИОбороты` +- **Без периодичности:** Объединяет результат двух подзапросов — `Остатки` на начало периода и `Обороты` за период. +- **С периодичностью:** Разбивает период на интервалы (день, месяц), получает остатки на начало каждого и обороты внутри него, затем объединяет. + ## Виртуальные таблицы и параметры #### Параметр "Период" @@ -46,7 +50,7 @@ title: Регистры накопления Если использовать МоментВремени = 21.11.2003 12:00:00, остатки будут рассчитаны до этого момента (движения в 12:00:00 не учтутся). -Если использовать Граница(МоментВремени, ВидГраницы.Включая), движения в этот момент будут учтены +Если использовать Граница(МоментВремени, ВидГраницы.Включая), движения в этот момент будут учтены. #### Параметр "Периодичность" **Варианты:** @@ -86,31 +90,25 @@ title: Регистры накопления - **Нет.** Набор записей формируется **только по регистратору** (документу). Отбор по измерениям невозможен. #### 5. **В чем разница между регистрами остатков и оборотов?** -**Ответ:** - **Остатки**: хранит и остатки, и обороты. Есть таблица итогов для остатков. Позволяет получить остатки на любую дату. - **Обороты**: только обороты, нет остатков. Может иметь агрегаты. -#### 6. **Как работает виртуальная таблица `ОстаткиИОбороты`?** -- **Без периодичности:** Объединяет результат двух подзапросов — `Остатки` на начало периода и `Обороты` за период. -- **С периодичностью:** Разбивает период на интервалы (день, месяц), получает остатки на начало каждого и обороты внутри него, затем объединяет. - -#### 7. **Когда создавать агрегаты и сколько таблиц агрегатов можно создавать?** -**Ответ:** Когда частые запросы в **нестандартных разрезах**: +#### 6. **Когда создавать агрегаты и сколько таблиц агрегатов можно создавать?** +Когда частые запросы в **нестандартных разрезах**: - Группировка по кварталам (а не месяцам) - Отчеты по подмножеству измерений - Частые отборы по конкретному измерению Ограничений по количеству таблиц нет. Можно создать для любых часто используемых комбинаций измерений и периодов (квартал, неделя). -#### 8. **Есть оборотный регистр с измерениями Подразделение, Контрагент. Данные получаем в основном по кварталу и контрагенту. Как ускорить?** -**Ответ:** +#### 7. **Есть оборотный регистр с измерениями Подразделение, Контрагент. Данные получаем в основном по кварталу и контрагенту. Как ускорить?** - **Основное:** Создать **агрегат** с измерениями `Контрагент` и периодичностью `Квартал`. - **Альтернативы:** 1) Поменять порядок измерений (Контрагент — первым). Изменение порядка — дорогостоящая операция при уже заполненной базе — требует перестройки таблиц из-за того что влияет на структуру индексов в СУБД. 2) Создать индекс по измерению `Контрагент`. -#### 9. **Для чего могут отключать итоги?** -**Ответ:** Когда нужно провести много документов по регистру. Так как в этом случае при проведении документа не будут пересчитываться итоги, операция выполнится быстрее. +#### 8. **Для чего могут отключать итоги?** +Когда нужно провести много документов по регистру. Так как в этом случае при проведении документа не будут пересчитываться итоги, операция выполнится быстрее. ## Материалы diff --git a/docs/theory/metadata/catalogs.md b/docs/theory/metadata/catalogs.md new file mode 100644 index 0000000..db08523 --- /dev/null +++ b/docs/theory/metadata/catalogs.md @@ -0,0 +1,39 @@ +--- +sidebar_position: 18 +sidebar_label: Справочники +title: Справочники +--- +**Объект метаданных для хранения списковых данных** (сотрудники, товары, контрагенты). Состоит из элементов с реквизитами и табличными частями. Может быть иерархическим и подчиненным. Аналогия: таблица в базе данных с элементами и их характеристиками. + +## Ответы на ключевые вопросы + +#### 1. Запись элемента без штатных обработок: +```bsl +// Через ОбменДанными.Загрузка +ОбменДанными.Загрузка = Истина; +``` + +#### 2. Отличие справочника от документа: +| Критерий | Справочник | Документ | +|---|---|---| +| **Назначение** | Хранение статичной информации | Фиксация хозяйственных операций | +| **Изменение** | Редко, вручную | Часто, как следствие событий | +| **Движения** | Не создает | Создает движения в регистрах | +| **Проведение** | Не проводится | Может проводиться | +| **Регистратор в регистрах** | ❌ | ✅ | +| **Пример** | Список товаров, сотрудников | Приходная накладная, счет | + +```bsl +// Справочник — это "кто/что" +Товар = Справочники.Товары.НайтиПоНаименованию("Молоко"); + +// Документ — это "что произошло" +Документ = Документы.ПриходнаяНакладная.СоздатьДокумент(); +Документ.Товар = Товар; +Документ.Количество = 10; +Документ.Провести(); // Создаст движения +``` +--- +Предопределенные элементы создаются в конфигураторе и автоматически появляются в базе. Управляются через ИмяПредопределенныхДанных. Критически важно правильно настраивать режимы обновления, особенно в распределенных системах. + +Режимы обновления предопределенных данных — Управление тем, КОГДА и КАК новые предопределенные элементы появляются в базе при обновлении конфигурации. \ No newline at end of file diff --git a/docs/theory/metadata/charts_accounts.md b/docs/theory/metadata/charts_accounts.md new file mode 100644 index 0000000..c50fb77 --- /dev/null +++ b/docs/theory/metadata/charts_accounts.md @@ -0,0 +1,71 @@ +--- +sidebar_position: 24 +sidebar_label: Планы счетов +title: Планы счетов +--- +**Объект метаданных для хранения структуры счетов бухгалтерского учета.** Иерархическая структура счетов с поддержкой аналитики через субконто. + +Ключевые особенности: максимум 3 субконто в типовых (ограничение СУБД), возможность отключения хранения остатков по субконто. Важно избегать примитивных типов в субконто из-за проблем с индексами СУБД." + +## Ключевые моменты + +| | Описание | Пример | +|---|---|---| +| **Иерархия** | Счета → субсчета → субсчета | 10 → 10.1 → 10.1.1 | +| **Субконто** | Аналитические разрезы учета | Организация, Склад, Номенклатура | +| **Признаки учета** | Доп. виды учета по счету | Количественный, Валютный | +| **Балансовый/Забалансовый** | Контроль баланса | Актив/Пассив или внебаланс | + +## Структура плана счетов + +#### Пример иерархии: +``` +ПланСчетов "Хозрасчетный" +├── 10 "Материалы" (субконто: Номенклатура, Склад) +│ ├── 10.1 "Сырье и материалы" +│ ├── 10.2 "Покупные полуфабрикаты" +│ └── 10.3 "Топливо" +├── 20 "Основное производство" +├── 26 "Общехозяйственные расходы" +└── 41 "Товары" (субконто: Номенклатура, Склад) +``` + +## Ответы на ключевые вопросы + +#### 1. Фиксация порядка субконто в запросе: +```bsl +Через параметр запроса можно задать порядок субконто. Передается массив с видами субконто в том порядке в котором нужно. +``` + +#### 2. Субконто без остатков (только обороты): +```bsl +// В свойствах субконто установить галку ТолькоОбороты +``` + +#### 3. Почему максимум 3 субконто в типовых: +```bsl +// Историческая причина: ограничения старых СУБД +// Каждое субконто ссылочного типа = 3 индексированных поля в SQL: + +// 3 субконто × 3 поля = 9 полей в индексе +// При 4 субконто → 12 полей → снижение производительности +// + ограничение старых версий MS SQL на 16 полей в индексе +``` + +#### 4. Не использовать примитивные типы в субконто: +```bsl +// ПЛОХО: Составной тип с примитивами +Субконто = [Справочник.Организации, Число, Строка, Дата] +// На уровне СУБД: 3 поля + 4 примитива = 7 колонок +// Индекс > 15 колонок → неэффективен в MS SQL + +// ХОРОШО: Только ссылочные типы +Субконто = [Справочник.Организации, Справочник.Склады] +// Только 2 × 3 = 6 колонок в индексе +``` + +#### 5. Количество регистров бухгалтерии: +```bsl +// На один план счетов можно создать: +// ✅ Неограниченное количество регистров бухгалтерии +``` diff --git a/docs/theory/metadata/common_modules.md b/docs/theory/metadata/common_modules.md new file mode 100644 index 0000000..ee27c82 --- /dev/null +++ b/docs/theory/metadata/common_modules.md @@ -0,0 +1,44 @@ +--- +sidebar_position: 2 +sidebar_label: Общие модули +title: Общие модули +--- +Назначение ключевых свойств + +| Свойство | Для чего нужно | Важные нюансы | +|---|---|---| +| **Сервер** | Исполнение кода *на сервере*. Доступ к серверным функциям (работа с ИБ, безопасность). | Без `Клиент`. Из клиента вызывается через `ВыполнитьНаСервере()` | +| **ВызовСервера** | Позволяет вызывать **экспортные** функции модуля *из клиентского кода напрямую*. | Работает только в паре с `Сервер`. Упрощает синтаксис. | +| **Клиент (Обычное)** | Исполнение кода *на клиенте*. Доступ к интерфейсу, диалогам, локальным данным. | Для толстого/управляемого клиента. | +| **Клиент (Управляемое)** | Исполнение кода *в веб-клиенте или тонком клиенте*. | | +| **ВнешнееСоединение** | Доступ к модулю *из внешних подключений* (COM, OLE, HTTP-сервисы, ВнешниеИсточникиДанных). | Нужен для интеграций, когда код запускается не из сеанса пользователя. | +| **ПовторноеИспользование** | Кэширование результатов функций для *одинаковых входных параметров*. | `НаВремяВызова` (до 20 мин от последнего вызова). `НаСеанс` (до конца сеанса). **Только простые типы параметров!** | + +## Типовые комбинации свойств + +| Сценарий использования | Рекомендуемые свойства | +|---|---| +| **Серверная логика, вызываемая из клиента** | `Сервер` + `ВызовСервера` | +| **Логика для внешних интеграций (COM, HTTP)** | `Сервер` + `ВнешнееСоединение` | +| **Обработчики событий (Подписки)** | `Сервер` (если логика серверная) + `ВнешнееСоединение` (если из COM) | +| **Глобальные утилиты** | `Сервер`/`Клиент` + `Глобальный` (осторожно!) | +| **Кэшируемый справочник настроек** | `Сервер` + `ПовторноеИспользование` | + +## Критически важные нюансы + +#### Повторное использование возвращаемых значений +* **Параметры:** Только простые типы (`Неопределено`, `Null`, `Булево`, `Число`, `Строка`, `Дата`, `Ссылка`). +* **Возвращаемые значения:** Рекомендуются иммутабельные (`ФиксированнаяСтруктура`, `ФиксированныйМассив`). +* **Память:** Необоснованное использование → утечки памяти (кэш живет до 20 минут). +* **Использовать если:** Результат часто нужен и стабилен (настройки, константы, справочники-списки). + +#### Глобальный общий модуль +* Функции доступны **без указания имени модуля**. +* **Требование уникальности имен** функций в рамках всей конфигурации. +* **Осторожно!** Может привести к конфликтам имен и усложнить чтение кода ("откуда эта функция?" + +#### Вызов сервера +* Устанавливать признак "Вызов сервера" только для тех серверных общих модулей, чьи экспортные методы действительно должны вызываться с клиента +* Не устанавливать этот признак принудительно для всех серверных модулей — он должен быть осознанным и ограниченным +* Размещать в таких модулях только безопасные методы, которые передают клиенту только разрешенные данные (например, итоговые результаты расчетов, а не исходные или промежуточные данные, недоступные пользователю) +* Не размещать в модулях с "Вызов сервера" методы, использующие привилегированный режим, либо требующие повышенных прав доступа \ No newline at end of file diff --git a/docs/theory/metadata/constant.md b/docs/theory/metadata/constant.md new file mode 100644 index 0000000..812dcc2 --- /dev/null +++ b/docs/theory/metadata/constant.md @@ -0,0 +1,23 @@ +--- +sidebar_position: 17 +sidebar_label: Константы +title: Константы +--- +**Объекты метаданных для хранения значений, единых для всей информационной базы.** Аналогия: "глобальные переменные" системы. Используются для системных настроек, бизнес-параметров, редко меняющихся данных. + +С версии 8.3 каждая константа хранится в отдельной таблице для исключения блокировок. + +## Ключевые моменты + +| | Описание | Пример | +|---|---|---| +| **Единичные значения** | Одно значение на всю базу | Валюта учета, организация +| **Редкое изменение** | Значения меняются нечасто | Настройки системы | + +## Рекомендации по использованию + +#### Использовать константы для: +- ✅ Системных настроек (валюта, организация) +- ✅ Параметров бизнес-логики (ставки, лимиты) +- ✅ Конфигурационных данных (версии, пути) +- ✅ Редко меняющихся значений diff --git a/docs/theory/metadata/documents.md b/docs/theory/metadata/documents.md new file mode 100644 index 0000000..55c8a17 --- /dev/null +++ b/docs/theory/metadata/documents.md @@ -0,0 +1,36 @@ +--- +sidebar_position: 19 +sidebar_label: Документы +title: Документы +--- +Объект метаданных для фиксации хозяйственных операций с временной привязкой. + +## Последовательности + +**Последовательности** — это механизм для автоматического перепроведения зависимых документов при изменении исторических данных. Устанавливает метку времени после которой требуется восстановление последовательности, до неё считается что учет корректен. + +Изменили ранний документ → система перепроводит все последующие. Критически важны для корректности расчетов (себестоимость, валютные переоценки), но создают проблемы с производительностью и блокировками. В современных конфигурациях используют альтернативные подходы (например, закрытие месяца). + +## Журналы документов + +**Журналы документов** - Объект метаданных для объединенного просмотра документов разных видов в одной таблице. Аналогия: "сводная таблица" для документов. Позволяют показывать один документ в нескольких журналах с разными графами (колонками). Используются для логической группировки по бизнес-процессам или ролям пользовате + +#### Когда создавать журналы: +- ✅ Логическая группировка документов (по процессам) +- ✅ Упрощение работы пользователей (одно окно) +- ✅ Контроль и мониторинг (сводные данные) + +## Ответы на ключевые вопросы + +#### 1. Из реквизитов перенесли движения документа на форму. Начали задваиваться движения при записи в форме. Почему? + +```bsl +// РЕШЕНИЕ: Установить галочку "Использовать всегда" +// Когда движения на форме они прочитаны и новые движения просто добавляются. +``` + +#### 2. Если проводим документ или перепроводим, то надо запустить алгоритм проверки расчетов показателей, которые были внесены в документ. Если показатели не верны, то необходимо сообщить об этом пользователю и не дать провести документ. Где и как это сделать? +```bsl +- Если ввод интерактивный в обработчике ОбработкаПроверкиЗаполнения +- Если программно тогда явно вызвать ПроверитьЗаполнение() +``` \ No newline at end of file diff --git a/docs/theory/metadata/exchange_plans.md b/docs/theory/metadata/exchange_plans.md new file mode 100644 index 0000000..19d68eb --- /dev/null +++ b/docs/theory/metadata/exchange_plans.md @@ -0,0 +1,127 @@ +--- +sidebar_position: 6 +sidebar_label: Планы обмена и РИБ +title: Планы обмена и РИБ +--- +**План обмена** — объект конфигурации для организации обмена данными между узлами. + +**РИБ** — частный случай использования планов обмена с централизованным управлением конфигурацией. + +## Иерархия и взаимосвязь +``` +План обмена (базовый механизм) + │ + ├── Обычный обмен (разные конфигурации) + │ + └── РИБ (специализированный обмен) + ├── Главный узел (изменяет конфигурацию) + └── Подчиненные узлы (только данные) +``` + +## Ключевые концепции плана обмена + +| Концепция | Описание | Важно | +|---|---|---| +| **Узлы плана** | Участники обмена (как элементы справочника) | Каждая база — предопределенный узел в своем плане | +| **Несколько планов** | Разные составы данных/механизмы для разных узлов | Гибкая настройка обмена | +| **Объекты обмена** | Данные для передачи: объекты БД + необъектные данные | Документы, справочники, регистры, константы | +| **Механизм регистрации** | Отслеживание изменений через свойство `ОбменДанными` | Формирует записи в таблицах регистрации изменений | + +#### Авторегистрация изменений: +| Режим | Механизм | Где настраивать | +|---|---|---| +| **ВКЛЮЧЕНА** | Регистрируются любое изменение объекта (включая перепроведение). План обмена автоматически заполняет `ОбменДанными.Получатели` | Состав данных плана обмена → признак Авторегистрация | +| **ВЫКЛЮЧЕНА** | Разработчик программно заполняет `ОбменДанными.Получатели` | Обработчики `ПередЗаписью()` и `ПередУдалением()`, Если после записи то использовать ПланОбмена.ЗарегистрироватьИзменения | + +## Архитектура плана обмена + +#### 1. **Регистрация изменений** +- Каждый объект обмена имеет свойство `ОбменДанными` +- При записи/удалении → формируются записи в таблице регистрации +- Одна запись на каждый узел-получатель + +#### 2. **Таблицы регистрации** +- Отдельная таблица для каждого типа объектов обмена +- Содержит: ссылку на объект, узел-получатель, номер сообщения +- Создаются только если объект в составе плана обмена + +#### 3. **Инфраструктура сообщений** +- Сообщение = единица обмена информации +- Уникальный номер в рамках плана обмена +- Подтверждения приема через номер последнего принятого сообщения + +## Особенности РИБ (как специализации) + +| Аспект | Обычный план обмена | РИБ | +|---|---|---| +| **Конфигурация** | Может отличаться | Одинаковая, изменяется только в главном узле | +| **Направленность** | Любая (peer-to-peer) | Иерархическая (центр → подчиненные) | +| **Автономность** | Полная | Ограниченная (без изменений конфигурации) | +| **Использование** | Интеграция разных систем | Распределение одной системы | + +#### Критические ограничения РИБ: +1. **Главный узел** — единственный источник изменений конфигурации +2. **Конфликты** — разрешаются в пользу главного узла +3. **Зависимость** — подчиненные не могут работать без обновлений конфигурации + +## Критические нюансы + +#### Производительность: +1. **Авторегистрация ВКЛ** → больше записей в таблице регистрации, возможны взаимные транзакционные блокировки +2. **Таблицы регистрации** → дополнительная нагрузка при записи объектов +3. **Очистка записей** → по подтверждениям от узлов-получателей + +#### При ОбменДанными.Загрузка = Истина +НЕ работают: + - ПриУстановкеНомера(), ПриУстановкеКода() + - ОбработкаПроведения() (документов) + - Автоматические заполнения и проверки + - ПередЗаписью() и ПриЗаписи() сработают, но если объект по "стандарту" (реализована проверка), то фактически код их не выполнится + +## Техническая реализация + +#### Таблица регистрации изменений: +| Поле | Назначение | Особенности | +|---|---|---| +| **Объект** | Ссылка на измененный объект | | +| **Узел** | Узел-получатель для этого изменения | | +| **Сообщение** | Номер сообщения, в котором отправлено | Null пока не отправлено | + +## Критерии выбора + +#### Использовать план обмена, если: +- ✅ Нужен обмен между базами 1С +- ✅ Регулярная синхронизация данных +- ✅ Встроенные механизмы конфликтов/повторов + +Для обмена с разными конфигурациямии нужны правила конвертации данных. + +#### Использовать РИБ, если: +- ✅ Одна распределенная система +- ✅ Централизованное управление конфигурацией +- ✅ Иерархическая структура (центр → филиалы) + +## Примеры работы + +#### 1. Регистрация объекта только, если новый: +```bsl +Процедура ПередЗаписью(Отказ) + Если Это Новый Тогда + ОбменДанными.Получатели = Новый Массив; + ОбменДанными.Получатели.Добавить(УзелДляОбмена); + КонецЕсли; +КонецПроцедуры; +``` + +#### 2. Удалить объект из регистрации при включеной Авторегистрации: +```bsl +Процедура ПередЗаписью(Отказ) + // Авторегистрация заполнила Получатели + // Удаляем ненужные узлы + Для Каждого Узел Из ОбменДанными.Получатели Цикл + Если Не НуженЭтоУзел(Узел) Тогда + ОбменДанными.Получатели.Удалить(Узел); + КонецЕсли; + КонецЦикла; +КонецПроцедуры; +``` diff --git a/docs/theory/metadata/external_data_sources.md b/docs/theory/metadata/external_data_sources.md new file mode 100644 index 0000000..8be1dae --- /dev/null +++ b/docs/theory/metadata/external_data_sources.md @@ -0,0 +1,14 @@ +--- +sidebar_position: 31 +sidebar_label: Внешние источники данных +title: Внешние источники данных +--- +**Внешний источник данных** — это конфигурационный объект 1С, который позволяет работать с внешними базами данных **как с родными таблицами 1С**. Подключение выполняется через ODBC драйвер с использованием строки подключения (возможен вариант программного подключения). + +В пользовательском режиме строка подключения задается в стандартной форме "Управление внешними источниками данных". + +#### Может использоваться: +- ✅ В запросах +- ✅ В СКД +- ✅ Указываться в реквизите + diff --git a/docs/theory/metadata/general_details.md b/docs/theory/metadata/general_details.md new file mode 100644 index 0000000..5fdcdb8 --- /dev/null +++ b/docs/theory/metadata/general_details.md @@ -0,0 +1,40 @@ +--- +sidebar_position: 5 +sidebar_label: Общие реквизиты +title: Общие реквизиты +--- +**Объекты метаданных для добавления реквизитов сразу для множества прикладных объектов** (справочников, документов, регистров). Два типа: **с разделением данных** и **без разделения данных**. Добавляется одинаковая колонка в разные таблицы базы данных + +**Разделяемые**: используется для разделения данных (например, по организациям). + +**Без разделения**: используется для решения технических задач конфиурации. Не предназначены для удобства добавления одинаковых реквизитов. + +## Ключевые моменты + +| | Описание | Важно | +|---|---|---| +| **Назначение** | Единый реквизит в разных таблицах | Добавляет одинаковую колонку в несколько таблиц | +| **Основное применение** | Разделение данных между организациями | В основном используется в 1С:Fresh | +| **Типы объектов** | Могут добавляться к большинству объектов | Документы, справочники, регистры | + +## Частые ошибки и проблемы + +1. **Использование для бизнес-логики** — реквизиты заказа, продажи и т.д. +2. **Необоснованное применение** — "просто чтобы было" +3. **Смешение с разделяющими** — использование не тех общих реквизитов +4. **Усложнение поддержки** — непрозрачная структура объектов + +## Рекомендации по использованию + +#### Когда применять: +- ✅ Технические/системные задачи конфигурации (не для разделения данных) +- ✅ Разделение данных (разделяемые реквизиты) + +#### Когда НЕ применять: +- ❌ Добавление одинаковых полей в разные объекты +- ❌ Решение бизнес-задач +- ❌ Упрощение разработки (без реальной необходимости) + +#### Альтернатива: +1. **Отдельные базы** — для каждой компании своя ИБ +2. **Логическое разделение** — через РЛС \ No newline at end of file diff --git a/docs/theory/metadata/information_registers.md b/docs/theory/metadata/information_registers.md index 19ee640..8147210 100644 --- a/docs/theory/metadata/information_registers.md +++ b/docs/theory/metadata/information_registers.md @@ -30,7 +30,7 @@ title: Регистры сведений **в) Уникальность записей** * Контролируется системой автоматически. * **Ключ записи** формируется из комбинации: - * Регистратора (если подчинен), + * Регистратора (если подчинен, но не всегда входит в разряд ключевых полей), * Периода (если периодический), * Значений **всех** измерений. * **Пример:** Не может быть двух одинаковых цен на одну номенклатуру в одном типе цен на одну дату. @@ -41,7 +41,7 @@ title: Регистры сведений * **Основной отбор** задаёт измерения, по которым формируется логическая единица данных. При обмене вместо отдельных записей передаётся весь набор записей, соответствующий комбинации значений этих измерений. Это обеспечивает целостность данных — например, все характеристики одного товара передаются вместе, а не по отдельности. -* Например, если в основной отбор включено измерение "Товар", то при изменении хотя бы одной записи по этому товару будут переданы все его характеристики2. +* Например, если в основной отбор включено измерение "Товар", то при изменении хотя бы одной записи по этому товару будут переданы все его характеристики. * **Основной отбор по периоду** доступен только для периодических регистров с независимым режимом записи. Если он включён, в логическую единицу обмена дополнительно включается поле Период, что позволяет группировать данные по времени. @@ -51,7 +51,7 @@ title: Регистры сведений * Предотвращают разрыв логической целостности данных при синхронизации между узлами * Определяют состав ключа в таблице регистрации изменений: для регистра без регистратора ключ формируется по измерениям с установленным "Основным отбором" и (если включено) по периоду -#### **Функциональные возможности (что можно делать)** +**д) Функциональные возможности (что можно делать)** * Получение «срезов» — значений ресурсов на заданную дату (последних, первых). @@ -75,7 +75,7 @@ title: Регистры сведений * Неопределено **4. Как программно определить, подчинен регистр сведений или нет?** -* Через объект метаданных: +* Через объект метаданных **5. В чем разница хранения между табличной частью справочника и регистра сведений?** * Для каждого справочника создается **отдельная таблица** в СУБД, даже если она пустая. Если табличная часть заполняется редко тогда лучше использовать регистр сведений. diff --git a/docs/theory/metadata/plan_characteristics_types.md b/docs/theory/metadata/plan_characteristics_types.md new file mode 100644 index 0000000..00002eb --- /dev/null +++ b/docs/theory/metadata/plan_characteristics_types.md @@ -0,0 +1,16 @@ +--- +sidebar_position: 23 +sidebar_label: Планы видов характеристик +title: Планы видов характеристик (ПВХ) +--- +**Объект метаданных для динамического добавления пользовательских атрибутов к объектам.** Позволяет создавать произвольные характеристики без изменения конфигурации. + +- Отличается от справочника переменным типом значений и более высокой абстракцией. +- План счетов использует **ПВХ** для хранения видов субконто (аналитик учета). +- **Дополнительные значения** — это подчиненный справочник, где пользователь сам создает значения для характеристик. Идеально для товаров с произвольными параметрами (цвет, размер, материал)." + +#### Использовать ПВХ когда: +- ✅ Нужны динамические атрибуты (пользователь сам добавляет) +- ✅ Разные объекты требуют разных наборов свойств +- ✅ Часто добавляются новые характеристики +- ✅ Хочется избежать постоянных доработок конфигурации diff --git a/docs/theory/metadata/roles.md b/docs/theory/metadata/roles.md new file mode 100644 index 0000000..508da39 --- /dev/null +++ b/docs/theory/metadata/roles.md @@ -0,0 +1,89 @@ +--- +sidebar_position: 4 +sidebar_label: Роли +title: Роли +--- +В 1С существует **два основных принципа**: +1. **Запрещено всё, что явно не разрешено.** +2. Нет механизмов **"запрета"**, есть только механизмы **"разрешения"**. Если право дано одной ролью, его невозможно отнять другой. + +**1. Права доступа** — это **минимальная и единственная единица**, определяющая доступ к чему-либо (объекту, реквизиту, режиму работы). Права связаны иерархически: чтобы дать право низкого уровня (например, "Редактирование"), нужно дать права более высокого уровня ("Чтение", "Изменение"). + +**2. Роли, профили и группы доступа** — это **обвязка для удобной группировки и выдачи прав**. +* **Роль** — набор связанных прав. +* **Профили доступа** и **Группы доступа** (в типовых решениях) — надстройки над ролями для массового назначения комплектов ролей пользователям. + +**3. Логика разрешений (пересечение ролей)** — итоговые права пользователя это **объединение (OR)** всех прав из всех его ролей. Важно избегать ситуаций, когда одна роль даёт нежелательный доступ, который нельзя будет забрать. + +**4. Косвенные механизмы управления доступом** + +| Механизм | Назначение | Влияние на доступ | Ключевые особенности | +| :--- | :--- | :--- | :--- | +| **Функциональные опции** | **Интерфейсное** скрытие неиспользуемого функционала (кнопок, полей). | **Не влияет на реальный доступ!** Пользователь может работать со скрытыми данными через обработки. | Упрощает интерфейс, но не защищает данные. | +| **RLS (Record Level Security)** | **Фильтрация** данных на уровне записей **в рамках конкретной роли**. | Ограничивает **выдачу** прав, разрешая работать только с определёнными записями (напр., по организации). | Это **фильтр**, а не запрет. Если право дано другой ролью без RLS — фильтр не сработает. | +| **Разделение данных** | Физическое разделение данных в одной ИБ для независимой работы (арендаторы, филиалы). | Жёсткая фильтрация по разделителю на уровне всех запросов. | Даёт выигрыш в скорости при работе внутри раздела, но резко замедляет работу при его отсутствии. | +| **Программный код** | Точечные ограничения в конкретных формах, отчетах или модулях объектов. | Частично ограничивает действия в заданных сценариях (например, проверка при открытии формы). | **Не гарантирует** полную защиту, так как данные могут быть получены другими способами (запросами, обработками). | + +**Итог:** +* **База:** Правильное разбиение на **роли**. +* **Ограничение видимости данных:** Использование **RLS**. +* **Частные случаи:** **Программный код**. +* **Упрощение интерфейса:** **Функциональные опции**. +* **Изоляция независимых данных:** **Разделение данных**. + +**Для анализа** итоговых прав пользователя в типовых конфигурациях используйте стандартный отчёт **"Права доступа"**. + +## RLS +**Разграничение прав доступа на уровне записей** (строк таблиц). Позволяет ограничить видимость данных для разных пользователей/групп. + +#### Ключевые моменты + +| | Описание | Важно | +|---|---|---| +| **Уровень** | Разграничение на уровне отдельных записей (строк) | В отличие от ролей (объектный уровень) | +| **Параметры** | Используются параметры сеанса `&Параметр` | `&ТекущийСклад`, `&ТекущийПользователь` | +| **Производительный режим** | Новая оптимизация в БСП 3.x | Требует специальной настройки | + +**Пример RLS для документа:** + +```bsl +// Ограничение по ответственному +Ответственный = &ТекущийПользователь +``` + +**Производительность:** +1. **Избегать периодических регистров** — сложные вычисления в RLS +2. **Использовать готовые данные** — предварительно рассчитанные значения +3. **Индексы** — поля в условиях RLS должны быть проиндексированы + +**Архитектура в типовых конфигурациях:** +1. **Профили групп доступа** — шаблоны настроек прав доступа, выбираются роли конфигурации +2. **Группы доступа** — указывается профиль, пользователи, ограничения на уровне записей +3. **Роли конфигурации** — привязываются к профилю +в + +**Частые ошибки** +1. **Сложные условия в RLS** — вычисления, подзапросы +2. **Дублирование условий** — в нескольких ролях для одного объекта +3. **Отсутствие индексов** — на полях, используемых в RLS +4. **Использование медленных виртуальных таблиц** — периодических регистров + +#### Оптимизация RLS + +**Производительный режим (БСП 3.x):** +- **Предварительные вычисления** — данные готовятся заранее +- **Кэширование** — результаты RLS кэшируются +- **Меньше JOIN** — упрощенные условия в SQL + +**Общие рекомендации:** +1. **Простая логика** — элементарные сравнения (`=`, `IN`) +2. **Использование справочников** — вместо вычислений в запросе +3. **Тестирование на объеме** — проверка с реальными данными + +**Множественные роли с RLS для одного пользователя:** +1. Разные объекты — можно +2. Разные права — можно (чтение + запись) + +## Материалы + +* [Управление доступом: роли, права, профили, группы доступа, функциональные опции, RLS](https://infostart.ru/1c/articles/685213/) \ No newline at end of file diff --git a/docs/theory/metadata/session_parameters.md b/docs/theory/metadata/session_parameters.md new file mode 100644 index 0000000..92e8cb3 --- /dev/null +++ b/docs/theory/metadata/session_parameters.md @@ -0,0 +1,34 @@ +--- +sidebar_position: 3 +sidebar_label: Параметры сеанса +title: Параметры сеанса +--- +**Глобальные переменные сеанса**, инициализируемые при старте или первом обращении. Используются для хранения контекста пользователя и в RLS. + +## Ключевые моменты + +| | Описание | Важно | +|---|---|---| +| **Модуль сеанса** | Место установки параметров | `УстановкаПараметровСеанса()` и `ПередУстановкойПараметраСеанса()` | +| **Инициализация** | При старте или лениво (при первом обращении) | Ленивая инициализация экономит ресурсы | +| **Синтаксис** | `ПараметрыСеанса.Имя` или `&Имя` (в запросах/RLS) | `&` — работает только в текстах запросов и RLS | +| **RLS** | Использование в условиях ограничения доступа | Безопасная передача контекста пользователя | + +## Практическое применение + +**Примеры сценариев:** +1. **Контекст пользователя** — роль, подразделение, организация +2. **Настройки сессии** — язык, валюта, режим работы +3. **Динамические условия RLS** — `Ответственный = &ТекущийПользователь` + +## Критические нюансы + +1. **Объем данных** — не хранить большие массивы (справочники лучше кэшировать иначе) +2. **Типы данных** — простые типы и ссылки, избегать сложных структур +3. **Инициализация** — параметр вычисляется один раз за сеанс + +## Частые ошибки + +- Циклические зависимости между параметрами +- Тяжелые вычисления при инициализации +- Хранение часто изменяемых данных \ No newline at end of file diff --git a/docs/theory/residue_control.md b/docs/theory/residue_control.md index ade163f..bd583cc 100644 --- a/docs/theory/residue_control.md +++ b/docs/theory/residue_control.md @@ -54,8 +54,7 @@ title: Контроль остатков Через **разделение итогов** (включено по умолчанию). Каждая транзакция пишет в свой "слой", итоги суммируются при чтении. #### 3. **Что делает `БлокироватьДляИзменения`?** -- **В режиме разделения итогов:** Выключает его, включает **управляемую блокировку** на записываемые строки. -- **Без разделения итогов:** Устанавливает монопольную блокировку. +- Выключает режим разделения итогов. ## Материалы