Персональная страница Федора Езеева
Главная
Download
Ссылки
MS SQL
Обмен данными
Новости
Статьи
О себе
Крупные разделы...
Коллективная разработка
1С++, OOP, XP
FuncTest
FAQ
Структура 1cv7.md

О пользе глупых вопросов,
о вреде слепого применения стандартов кодирования
и совсем немного о глобальном модуле.

Рассматривал я как-то глобальный модуль, и обнаружил в нем забавную функцию:

// Функция возвращает переданное значение параметра (для получения Контекста)
Функция глВзятьКонтекст(Конт) Экспорт
	Возврат Конт;
КонецФункции
И задумался я: А нужна ли она вообще? В каких случаях мы не можем использовать непосредственно Контекст?

  • Внутри самого модуля мы можем Контекст вообще не использовать - он нам доступен непосредственно.
  • Если мы передаем Контекст в другой модуль - мы можем это сделать непосредственно, без участия переменной.
  • Даже если мы хотим спрятать Контекст в список или таблицу значений - и тогда все работает отлично.

После трех часов удаления лишних вызовов этой функции, я, наконец, сообразил, в каких случаях это неободимо.

Итак. Из модуля открываем некую форму, в нее в качестве параметра передаем текущий контекст, а после открытия, в изначальном модуле нам нужен контекст открытой формы. Поскольку контекст открытой формы возвращается в ту же переменную, что и передает параметры - возникает некая коллизия. Тут использовать Контекст мы не можем, поскольку он не того типа и поменять его не может :). Нужна переменная. Пример:

Парам=глВзятьКонтекст(Контекст);
ОткрытьФорму("Обработка.ХитраяОбработка",Парам);
Парам.Закрыть(); //Здесь может быть любое другое использование контекста формы

В этом случае мы не можем написать

ОткрытьФорму("Обработка.ХитраяОбработка",Контекст);
поскольку нам неоткуда будет взять контекст открытой формы.

Что характерно, после вызова ОткрытьФормуМодально() контекст открытой формы никогда не может быть доступен, что в общем-то довольно логично. Однако из 125 случаев использования функции глВзятьКонтекст() в моей конфигурации, 104 раза она использовалась именно в ОткрытьФормуМодально(). Единственным оправданием для такого идиотизма может быть только слепое следование каким-то внутренним стандартам кодирования, принятым в 1С при написании типовых.

P.S.
Мне пришло несколько отзывов на эту статью. Основная масса возражений была на уровне "ну и насколько быстрее стало работать?" и "работает - не трогай".
Так вот: всем, кому стало обидно за функцию глВзятьКонтекст() и за программистов любимых типовых конфигураций - предлагаю подумать над простым вопросом: почему вы не используете конструкции вроде этой

Четыре = глВзятьКонтекст(2) + глВзятьКонтекст(2);
Сообщить(глВзятьКонтекст(Четыре));
?

Rambler's Top100 1C:TOP-100

© 1998-2004 Fedor Ezeev.

Last updated: 2005-09-05