V
vitfil
Собственно, описываются проблемы, которые приходилось решать, а также причины их возникновения. Ну, и некоторые полезные советы.
Транзакции, будь они неладны
Имеем следующий код:
Процедура ОбработкаПроведения()
...
Спр = СоздатьОбъект("Справочник.ХХХ");
Спр.НайтиЭлемент(...);
Попытка
Спр.Записать();
Исключение
КонецПопытки;
...
КонецПроцедуры
И где-то в глобальнике...
...
Спр = СоздатьОбъект("Справочник.ХХХ");
Спр.НайтиЭлемент(...);
В результате получаем ошибку попытки прочитать данные, находящиеся в транзакции, созданной другим пользователем. А заодно и увещевания, что 1С настолько тормознутая, что не может прочитать элемент из справочника, в котором всего-то 20 позиций.
Объяснение.
Вся процедура ОбработкаПроведения неявно заключена в транзакцию. Следовательно, все данные, которые изменяются в этой транзакции, типа Спр.Записать() не пишутся напрямую в базу, а включаются в пакет транзакции для возможности отката при СтатусВозврата(0). Следовательно, таблица используемого справочника будет заблокирована. А так как 1С не выполняет "грязных" чтений данных, получаем описанную выше ошибку.
Оптимизация регистров
Собственно, взято из доки по 1с++, но будет полезным знать даже если не используете оную компоненту.
Транзакции, будь они неладны
Имеем следующий код:
Процедура ОбработкаПроведения()
...
Спр = СоздатьОбъект("Справочник.ХХХ");
Спр.НайтиЭлемент(...);
Попытка
Спр.Записать();
Исключение
КонецПопытки;
...
КонецПроцедуры
И где-то в глобальнике...
...
Спр = СоздатьОбъект("Справочник.ХХХ");
Спр.НайтиЭлемент(...);
В результате получаем ошибку попытки прочитать данные, находящиеся в транзакции, созданной другим пользователем. А заодно и увещевания, что 1С настолько тормознутая, что не может прочитать элемент из справочника, в котором всего-то 20 позиций.
Объяснение.
Вся процедура ОбработкаПроведения неявно заключена в транзакцию. Следовательно, все данные, которые изменяются в этой транзакции, типа Спр.Записать() не пишутся напрямую в базу, а включаются в пакет транзакции для возможности отката при СтатусВозврата(0). Следовательно, таблица используемого справочника будет заблокирована. А так как 1С не выполняет "грязных" чтений данных, получаем описанную выше ошибку.
Оптимизация регистров
Собственно, взято из доки по 1с++, но будет полезным знать даже если не используете оную компоненту.
Существует всего 3 способа.
1) Установка флага БыстраяОбработкаДвижений. Очень полезен при частых расчетах регистра задним числом, а также при снятии отчета за не полный период.
При установке этого флага в таблицу движений регистра добавляется поле Date_Time_IDDoc и IDDocDef, что убирает необходимость присоединения таблицы _1SJourn для определения даты.
2) Правильная расстановка измерений ресурса: Рассматриваем только те, по которым идет отбор. Сначала идет измерение с самым большим количеством значений, потом поменьше и в конце измерения по которым менее всего нужен отбор. Это связано с наличием одного индекса по всем измерениям.
Пример: Регистр.Партии: Склад, Товар, Партия, Фирма
Отбор по партии практически не нужен, поэтому правильно расположить измерения так: Товар, Склад, Фирма, Партия
3) Установка флага отбор движений у измерения
1 и 3 способы приводят к заметному увеличению индекса, поэтому нужно помнить о балансе записи и чтения.