"Справочник плюс". Прямая запись в справочники 1С 7.7

12.06.12

Разработка - Инструментарий разработчика

"Справочник плюс" - замена штатного объекта "Справочник.ХХХ"
Предназначен для "прямой" записи, и дает возможность управлять табличными подсказками при чтении.
Позволяет избавиться от монопольных блокировок таблиц справочников и таблицы констант.
Главным мотивом написания было избавиться от вылетов 1С из-за deadlock-ов и "недопустимых состояний курсоров".
Состоит из нескольких классов 1с++, нескольких переменных и методов в глобальном модуле.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
SpravochnikPlus.rar
.rar 1,12Mb
25
25 Скачать (1 SM) Купить за 1 850 руб.

  Изменения от 12.06.2012:

Изменено именование классов со "Справочник.ХХХ.А" / "Справочник.ХХХ.Б" на: "Справочник.ХХХ",

поэтому теперь при подключении классов нет необходимости переименовывать все справочники в конфигурации.


Немалая часть вылетов 1С 7.7 на SQL базах связано с записью в справочники. Иногда 1с про ошибки говорит и вылетает. Это desdlock-и и "недопустимые состояния курсора". А иногда уходит по английски, ничего не сказав. Я думаю это связано с очень поверхностной обработкой ошибок которые 1С получает от SQL.

Что "Справочник плюс" дает.

1. Запись выполняется без монопольных блокировок таблиц.

2. Можно управлять блокировками используя "почти штатные" методы.

3. Скорость записи немного выше.

4. Открытая форма элемента не блокирует запись.

5. Пишется только то, что изменил пользователь. Например пользователь мог открыть форму элемента, поменять там один реквизит, пойти покурить. Пока форма открыта, программно было записано 2 реквизита. Когда пользователь нажмет ОК. Запишется только один, изменненый им, реквизит.

6. Следствие пункта 5: Легко отслеживать и, при необходимости, фиксировать, что менял пользователь.

7. Нет нужды в перехвате событий справочника как объекта. Все события у вас уже под руками.

8. Со временем хочу заменить все штатные (курсорные) выборки на запросы. И скорость выше и нагрузка не систему ниже и встреч с "недопустимыми состояниями курсора" не будет.


Как это работает:

Как подключаются компоненты и классы можно посмотреть в тестовой конфигурации и, если чего не понятно, почитать на www.1cpp.ru/

Я укажу только суть:

1. В глобальнике:

Еще до загрузки 1CPP.dll проверяется и при необходимости пересоздается файл определения классов с полным перечнем справочников.

Далее при загрузке 1CPP.dll создаются классы вида "Справочник.ХХХ", которые являются наследниками от "Reference.ХХХ" и "ТаблицаЗначений".

2. В формах:

События формы перехватываются Классом ПерехватчикГК (Это класс выполняющий роль фабрики событий группового контекста) и направляются в класс ПерехватчикГК.Справочник - класс обслуживающий прямую запись во всех формах справочников (и в формах списков и  элементов и групп). В классе можно указать "Неперехватываемые" справочники.

При выполнении события ПриЗаписи() устанавливается СтатусВозврата(0) 1с-у говорим, что записывать не будем, создаем объект "Справочник.Вид.Б" и при специальным методом "ЗаписатьИзФормы" пишем самостоятельно.

Минусы при записи из формы:

1. После записи нового элемента форма не знает, что элемент записан, поэтому Выбран() = 0 а ТекущийЭлемент() = пустое значение. Для обхода этой проблемы к контексту формы добавляется свойство: ТекущийЭлементПрямойЗаписи. А для получения текущего элемента формы лучше использовать глобальную функцию: глТекущийЭлементФормы(Контекст).

 

ТРЕБОВАНИЯ и ОГРАНИЧЕНИЯ:

1. FormEx.dll, 1CPP.dll (вложены)

2. УРБД не поддержано. Если разработка заинтересовала готов поддержать.

3. В ПриЗаписи() нельзя использовать метод формы Записать() - происходит выход 1с-а в астрал.

4. Если используется событие ФормаПослеЗаписи() в начале Метода НЕОБХОДИМО вставить: СтатусВозврата(1); это связано с особенностью реализации этого метода: при СтатусеВозврата() = 0 в ПриЗаписи() этот метод уже на входе имеет СтатусВозврата() = 0

5. ТекущийЭлемент() в форме необходимо получать через глобальную функцию

глТекущийЭлементФормы(Контекст)

6. Если запись выполняется без закрытия формы, то После записи форма закрывается, а затем открывается. Так проще.

7. Наверно нужно причислить к недостаткам: Фабрика событий не стандартный класс фабрики событий 1Cpp. Ну не нравится мне передача параметров через список. Сначала укладываем, потом разукладываем это ведь время.


Состав архива:

 Каталог тестовой базы со всем необходимым внутри + Выгрузка этой же базы.

 

Пример использования:

Как генерить гарантированно уникальные записи в справочиках. 

Измененный метод  НайтиПоРеквизиту() имеет два дополнительных параметра. Синтаксис:

НайтиПоРеквизиту(ИмяРеквизита,Значение,ФлагГлобальногоПоиска=1,Хинт=0,ТолькоСсылку=0)

Хинт - способ чтения. Можно указать строкой, можно числом. Строка - все, что съест ms SQL; Число: наиболее полезные подсказки: 0 - nolock, 1 - readcommitted, 2 - serializable, 3 - updlock

ТолькоСсылку значения: 0 - прочитать все реквизиты (по умолчанию); 1 - только найти ссылку (ТекущийЭлемент())  

спр = СоздатьОбъект("Справочник.УникальныйПоРеквизиту");
// Ищем ссылку с хинтом 2 (serializable) (гарантированно записанные и никем не изменяемые в момент чтения данные)
Если спр.НайтиПоРеквизиту("УникальныйРеквизит",125,1,2,1) = 0 Тогда
    // Если Не нашли: открываем транзакцию и читаем с хинтом 3 (updlock) - чтение, дающее гарантию, что до завершения
    // транзакции никто другой не сможет записать анналогичные данные. (Данные соответсвующие нашим условиям).
    НачатьТранзакцию();
    Если спр.НайтиПоРеквизиту("УникальныйРеквизит",125,1,3,1) = 0 Тогда
        // Если не нашли со спокойной совестью пишем гарантия уникальности = 100%
        спр.Новый();
        спр.УникальныйРеквизит= 125;
        спр.Записать();
    КонецЕсли;
    ЗафиксироватьТранзакцию();
КонецЕсли;  


См. также

Инструментарий разработчика Системный администратор Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Консоль запросов к базе SQL, не требующая внешних компонент

10 стартмани

29.04.2015    22293    57    Gvozdod    8    

16

Инструментарий разработчика Системный администратор Программист Платформа 1С v7.7 Платформа 1С v8.3 Абонемент ($m)

Очередная редакция альтернативного стартера, являющегося продолжением StartManager 1.3. Спасибо всем, кто присылал свои замечания и пожелания, и тем, кто перечислял финансы на поддержку проекта. С учетом накопленного опыта, стартер был достаточно сильно переработан в плане архитектуры. В основном сделан упор на масштабируемость, для способности программы быстро адаптироваться к расширению предъявляемых требований (т.к. довольно часто просят добавить ту или иную хотелку). Было пересмотрено внешнее оформление, переработан существующий и добавлен новый функционал. В общем можно сказать, что стартер эволюционировал, по сравнению с предыдущей редакцией. Однако пока не всё реализовано, что планировалось, поэтому еще есть куда развиваться в плане функциональности.

1 стартмани

23.04.2014    168410    1882    Alexoniq    1596    

499

Инструментарий разработчика Программист Платформа 1С v7.7 Платформа 1С v8.3 Россия Абонемент ($m)

Согласитесь, что окно стандартное сообщений в 1С иногда приносит больше неудобств, чем пользы. И тем более разные "Предупредить"... Что с этим окном только не делают! Его отцепают от формы, делают маленьким, умудряются спрятать за границы экрана. А потом звонят программистам с претензией, что документ почему-то не проводится, отя ничего и не пишет. У вас такого не было? А вот у нас было и не раз )))

1 стартмани

04.09.2013    33416    61    O-Planet    78    

49

Инструментарий разработчика Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

На днях встретил вопрос на форуме про возможность внесения изменений в конфигурацию без долгого сохранения в рабочей базе большого объема. Вот решил поделиться опытом, как это делал я. База у нас была объемом порядка 120 Гб. К базе обращался сайт в режиме 24/7, поэтому важно было быстро сохранять изменения и желательно без последующего монопольного запуска для восстановления индексов и процедур и без отключения пользователей от базы. Это первая часть статьи и посвящена она справочникам. С одной стороны - это самый простой объект, с другой стороны, именно про справочник спрашивалось на форуме. Если статья будет востребована, то я напишу аналогичные про документы, регистры и может еще что.

1 стартмани

13.08.2013    21810    Reptile    5    

35

Инструментарий разработчика Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Встала недавно задача для одной организации, которая все еще на 1С 7.7 немного автоматизировать работу отдела продаж. А именно уйти от ручного заполнения договоров, сделанных юристами в MS Word. Договора от разных фирм и разного назначения отличались. Переводить их в таблицы 1С очень не хотелось и нашел способ прямо в файлах Word сделать небольшие дополнения, чтобы можно было печатать, используя именно эти заготовки юристов.

1 стартмани

14.07.2013    27661    56    adamx    11    

14

Инструментарий разработчика Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Давным давно, когда я еще плотно писал на 7.7 работа с формами была мучительной и неудобной. Приходилось каждый элемент выкладывать, выравнивать на форме ручками, прописывать код в модуле. Иногда при разработке очередной формы приходила в голову мысль: "а где-то я уже похожее делал..." и начинался мучительный поиск подходящего кода в своих запасах........

1 стартмани

21.02.2013    18356    36    MarSeN    14    

17

Инструментарий разработчика Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Анализируем различные данные в 1С, используя OLAP-технологии со всеми прелестями. Т.е. наглядное отображение данных, быстрые расчеты, горизонтальные и вертикальные группировки любой вложенности, удобная фильтрация, Drag'n'Drop и ещё много приятных вещей от MS. Обработка на входе принимает практически любую таблицу значений (ТЗ в которой колонкам указаны типы значений, строка, число и т.п.), на выходе имеем на форме 1С сводную таблицу и график по этой ТЗ, с которой работаем, как и в Excel со сводной таблицей и диаграммой. Взял за основу разработку «OLAP Анализ счёта» ( http://infostart.ru/public/14964/ ) от JohnyDeath и переделал под любую ТЗ. Опционально используется «Прогресс бар для 1С 77» (http://infostart.ru/public/14061/ ) от Gmix.

1 стартмани

21.12.2012    36356    51    venger    7    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Ёпрст 1065 28.05.12 13:36 Сейчас в теме
Это, а как же методы НовыйКод,НовыйИД класса SQLLOck ?
3. an_2 19 28.05.12 14:29 Сейчас в теме
(1) Ёпрст,
>> Это, а как же методы НовыйКод,НовыйИД класса SQLLOck ?
Сначала пришлось отказаться от НовыйКод
На одном справочнике SQLLOck был не в состоянии правильно генерить новый уникальный код. Что именно происходило не так я к сожалению сказать не могу. Вникать не стал. Могу только сказать про сам справочник. Там был текстовый код длиной 5 символов и параллельно использовалось несколько разных префиксов длиной в 1 символ.
Не стал вникать еще и потому, что было 2 дополнительных мотива:
1. Проверку уникальности новых кодов с учетом всех нюансов я уже сделал до этого. То есть до самостоятельной генерации оставалось совсем малость.
2. Самостоятельно генерить было удобнее. Более управляемый процесс. Сейчас при генерации я анализирую новый код и, если он неудачный меняю правила и генерю по-другому, либо, если вариантов, нет - выбрасываю исключение.

Теперь по поводу НовыйИД
Опять таки сначала юзал SQLLOck. После анализируя замеры производительности, увидел, что SQLLOck потребляет слишком много времени. Посмотрел сколько необходимо времени на получение MAX(ID) и отказался от SQLLOck полностью.
2. Ёпрст 1065 28.05.12 13:39 Сейчас в теме
>>>>Пробовал переопределить СоздатьОбъект("Справочник.Вид"); без всяких .А/.Б - ничего хорошего не получилось.

А в чем именно был затык ?
На каких именно методах ?
Что не удалось переопределить своим классом ?
4. an_2 19 28.05.12 15:07 Сейчас в теме
(2) Ёпрст,
>>>>Пробовал переопределить СоздатьОбъект("Справочник.Вид"); без всяких .А/.Б - ничего хорошего не получилось.

>>А в чем именно был затык ?
>>На каких именно методах ?
>>Что не удалось переопределить своим классом ?

Мгновенный вылет 1с при попытке создания Объекта.
Использую 25 релиз.
Наследовать пытался, как рекомендовали на форуме от "Reference".

Я подумал, что какие бы ни были причины лучше не собирать лишние грабли. Тем более что как я понял ответ на вопрос что делать с ТипЗначенияСтр() так и остался открытым.
У меня предприятия большие и самый важный показатель работы системы - стабильность. Собственно и класс для этого рисовался.
Плюс ветка посвященная этому вопросу была довольно стара и закончилась ничем:
http://www.1cpp.ru/forum/YaBB.pl?num=1175586636/0
В общем как-то так.
5. an_2 19 28.05.12 15:18 Сейчас в теме
(2) Ёпрст,
Да и я, если честно, решил что наследование без изменения имени это что-то из разряда "фича, которую лучше обходить стороной". На форуме не мало было сообщений о нестабильности 1с-а при таком наследовании.
6. an_2 19 28.05.12 15:45 Сейчас в теме
(2) Ёпрст,
Да. Забыл написать свое мнение по этому поводу.
Я очень даже за отказаться от .А/.Б
Если есть желание разобраться в причинах вылетов и устранить проблемму. Я готов к сотрудничеству.
Может проблемма где-то у меня.
Пойду покопаю :)
13. an_2 19 31.05.12 05:22 Сейчас в теме
(2) Ёпрст,(6)
Накопал. Проблемму нашел и исправил. Скоро залью исправленный архив.
При желании можно будет переопределять объект "Справочник.Вид" без А/Б.
Поскольку вероятность Использования метода к ТипЗначенияСтр() к созданному объекту "Справочник.Вид" почти = 0.
В принципе рабочий вариант.
Но ТипЗначенияСтр() надо будет иметь ввиду при использовании.
7. Ёпрст 1065 28.05.12 15:56 Сейчас в теме
Для каких-то нужд тоже подменял документ своим классом, потом забил на это дело.
Надо скачать посмотреть твой .
Просто у меня уже используется перехватчик для своих классов.
Грузить еще один - пересматривать весь код :)
8. an_2 19 28.05.12 16:04 Сейчас в теме
(7) Ёпрст,
Я парень не религиозный.
Если отряд идет не в ногу я один в ногу, то надо думать что что-то со мой не так.
Я к тому, что следует мне переписать перехватчик. Точнее наверно лучше заюзать общепринятый.
Вопрос только в том какой он общепринятый?
Тот, который в классе "УправлениеФормой"?
На форуме я находил разные классы.
Особенно меня поразил своей мудреностью тот которые в "Репозитарий классов 1С++ в единой конфе".
9. an_2 19 28.05.12 16:21 Сейчас в теме
Только что посмотрел "УправлениеФормой.ert"
Там на мой взгляд есть одна проблемма:

Процедура Событие_ОбработкаВыбораЗначения(ВыбЗнач,ИДАтрибута,ФСО) Экспорт
СЗПараметры = СоздатьОбъект("СписокЗначений");
СЗПараметры.Установить("ВыбЗнач",ВыбЗнач);
СЗПараметры.Установить("ИДАтрибута",ИДАтрибута);
СЗПараметры.Установить("ФСО",ФСО);
СообщитьПодписчикам("ОбработкаВыбораЗначения",СЗПараметры);
ФСО = СЗПараметры.Получить("ФСО");
Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтекстФормы,"ОбработкаВыбораЗначения",ВыбЗнач,ИДАтрибута,ФСО);
КонецПроцедуры

Я наблюдал ситуации, когда Метод "ОбработкаВыбораЗначения" подписчиков "Съедает" события.
Явление редкое но бывает. Закономерностей сказать не могу.
Лечил тем, что переименовівал на: "Событие_ОбработкаВыбораЗначения"
10. an_2 19 28.05.12 17:50 Сейчас в теме
(9)
> Под "Метод "ОбработкаВыбораЗначения" подписчиков "Съедает" события" я имел ввиду следующее: Событие вызывается в первый и единственный раз в модуле какого нибудь подписчика и до перехватчика событие не доходит.
11. avhrst 519 29.05.12 00:40 Сейчас в теме
Даеш нормальную обработку транзакций :)
12. Ёпрст 1065 29.05.12 09:20 Сейчас в теме
Тот что в УправленииФормой был изначально не верным - в нём было слишком много мысора - пустых объявлений методов.
Каков он сейчас - не знаю, не ведаю, не использую.
У меня свой
:)
14. Artemuch2 06.07.12 15:39 Сейчас в теме
>> Это, а как же методы НовыйКод,НовыйИД класса SQLLOck ?
Сначала пришлось отказаться от НовыйКод
На одном справочнике SQLLOck был не в состоянии правильно генерить новый уникальный код. Что именно происходило не так я к сожалению сказать не могу. Вникать не стал. Могу только сказать про сам справочник. Там был текстовый код длиной 5 символов и параллельно использовалось несколько разных префиксов длиной в 1 символ.
Не стал вникать еще и потому, что было 2 дополнительных мотива:
1. Проверку уникальности новых кодов с учетом всех нюансов я уже сделал до этого. То есть до самостоятельной генерации оставалось совсем малость.
2. Самостоятельно генерить было удобнее. Более управляемый процесс. Сейчас при генерации я анализирую новый код и, если он неудачный меняю правила и генерю по-другому, либо, если вариантов, нет - выбрасываю исключение.

Теперь по поводу НовыйИД
Опять таки сначала юзал SQLLOck. После анализируя замеры производительности, увидел, что SQLLOck потребляет слишком много времени. Посмотрел сколько необходимо времени на получение MAX(ID) и отказался от SQLLOck полностью
15. an_2 19 06.07.12 15:58 Сейчас в теме
(14) Artemuch2,
????
Я так понимаю очепятка?
Оставьте свое сообщение