Объектно-ориентированный дзен

Опубликовал Two World (Prometeus2011) в раздел Программирование - Практика программирования

Пара способов неочевидного использование возможностей ООП и транзакций в 1С 8.х для быстрой разработки доп. функционала или заплаток уровня «На коленке» или чуть посложнее

Очень часто в практике возникают ситуации, когда вроде-бы уже есть нужный функционал, но под требования заказчика он чуть-чуть не подходит, а код написан так ужасно, что разбираться в нем очень не хочется, либо нет времени. Будь то расширение какого-нибудь функционала или «прикрутка» существующей в одном объекте конфигурации печатной формы к другому объекту конфигурации, либо получение какой-либо аналитической информации, которая становится доступна в определенном состоянии того или иного объекта (например, состояние проведенности - у документа). Такую проблему можно решить «в лоб», т.е. закусить удила и нафигачить сотню строк кода, а можно решить дело текстом объемом раз в 10 меньшим, чем оригинальный алгоритм.

  1. Например, требуется реализовать печать накладной на оказание услуг из заказа покупателю. Очень частный случай, но таких - масса. Быстрым решением может быть создание «временного» объекта в транзакции, при последующем ее откате:
обДокРеализация = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
обДокРеализация.Заполнить(ссДокЗаказПокупателя);
НачатьТранзакцию();
обДокРЕализация.Записать();
обДокРЕализация.Печать("Накладная");
ОтменитьТранзакцию();
  1. Второй характерный случай, когда фанатичное применение ООП сильно может облегчить жизнь разраба - это обработка группы объектов функционалом, предназначенным для обработки одного объекта. Например, в УТ 10.3, есть досадный недостаток штатного функционала, не позволяющий одновременно по кнопке «изменить» обрабатывать все типы цен, выбранные в документе Установка цен номенклатуры. Только последовательно. При этом, код обработки довольно хлесткий и, в случае доработки, на его анализ и внедрение потребуется значительное время. Решением может послужить создание нескольких экземпляров объектов обработки «Формирование цен» и их последовательный запуск с предустановленными параметрами, без открытия форм (параметры выбираются только в первой форме). Однозначно, в памяти рождается конструкция безумного размера, однако экономия времени на разработку существенная. Надежность метода – неплохая. Работает в огне и недостатков пока не выявлено.
  2. Еще один вариант практической камасутры с привлечением объектно-транзакционных кренделей был применен в обработке по выборочной корректировке движений документов. Например, двигает документ с десяток регистров остатков и с пяток регистров сведений. Ну переписали мы алгоритм формирования записей по какому-нибудь из этих регистров, а период уже закрыт, остатки выгружены и уж очень перепроводить все подряд не хочется, а записи по одному из регистров сведений поправить очень надо. В данной ситуации я поступил так:
    • открыл транзакцию
    • получил список регистраторов регистра
    • провел их
    • сохранил в ТЗ новые наборы записей, сформированные документами при проведении
    • откатил транзакцию
    • переписал выбранные наборы записей у регистраторов, без их перепроведения.

Овцы целы и волки сыты. А если в реалиях, то: яй..а при программисте и техническая задача решена.
Пример обработки с пригодным для использования интерфейсом – прилагается. В обработке есть морды для обычного и управляемого приложений. Запускаются сами, в зависимости от режима приложения.


Если кто знает еще какой дзен - прошу поделиться.

Скачать файлы

Наименование Файл Версия Размер
Выборочная корректировка движений документов
.epf 14,32Kb
18.06.15
4
.epf 1.0 14,32Kb 4 Скачать

См. также

Комментарии
1. Сергѣй Батанов (baton_pk) 203 18.06.15 19:03 Сейчас в теме
код написан так ужасно, что разбираться в нем очень не хочется

и далее нам раскрываются истинные причины, почему же всё так плохо...
bulpi; kuntashov; +2 Ответить
2. eugenie zheludkov (eugeniezheludkov) 29 19.06.15 02:10 Сейчас в теме
я как то сделал документы в транзакции с откатом, в самописной конфе. Нужно понимать что все что вы делаете в транзакции тут же пишется в ИБД. Все могут читать эти изменения и все отчеты которые строятся в этот момент так же видят проводки этих документов! затем отменить транзакцию просто "откатывает" все изменения исходя из лога транзакции. В момент транзакции другой менеджер по ценообразованию построил отчет, и о чудо цена на товар изменилась... (ПС в базе в этот момент как правило работало 6000 - 9000 человек и вероятность такой коллизии стремится к 100%)
3. Two World (Prometeus2011) 30 19.06.15 08:57 Сейчас в теме
(2) eugeniezheludkov, А я чего-то думал, что пока транзакцию не зафиксируем - в ИБ ничего не пишется.
4. Two World (Prometeus2011) 30 19.06.15 08:57 Сейчас в теме
(2) eugeniezheludkov, Надо проверить.
5. Евгений Сосна (pumbaE) 519 19.06.15 09:06 Сейчас в теме
(2) eugeniezheludkov, если у вас работало 6000-9000 человек в одной базе, то вы должны были-бы знать, что надо или на 8.3 переходить или же критически важные отчеты, где нельзя использовать грязное чтение, то запускать их в транзакции.
4rtehouse; JohnyDeath; +2 Ответить 1
6. Юрий Иванов (urcont) 19.06.15 10:27 Сейчас в теме
(5) Вроде как человек не писал какая у него платформа. На каком основании Вы решили, что у него не 8.3?
И потом, что в 8.3 другая схема работы с транзакциями?
7. Евгений Сосна (pumbaE) 519 19.06.15 10:33 Сейчас в теме
(6) urcont, да в 8.3 другое поведение, для MS SQL. В гугле запрос называется "грязное чтение + 1C".