Alexander Speshilov (speshuric) wrote,
Alexander Speshilov
speshuric

Повесть о настоящем параметре.

Жил да был маленький кусочек памяти в городе 1С на улице модуля одной скромной формы всего с тремя контролами в процедуре обработчика события "ПриЗакрытии". И с самого объявления все знали этот кусочек памяти как ОченьНужноеЧисло, и самой первой инициализации числом 2.5 все знали, что ТипЗнч(ОченьНужноеЧисло)=Тип("Число"). Трудился ОченьНужноеЧисло наравне с другими кусочками памяти, одни из которых были такими же числами, другие строками, третьи вовсе то коллекциями всякими странными, а то и совсем сложными типами. И славился ОченьНужноеЧисло тем, как споро и шустро он участвовал в выражениях, как быстро пробегал по циклам и помогал мудрые решения дядьке оператору Если принимать. Менялся он за время работы несколько раз, но слава Разработчику так числом и оставался. Ни страшное деление на ноль его не зацепило, ни присваивались ему значения сложные и громоздкие.
Тут бы и сказочке Возврат да на беду случился в коде его родной процедуры толстенный ЗагрузитьВнешнююКомпоненту. И ведь мало того, что сам непонятно чем занимался полдня, так и следом ВнешнийОбъект = Новый("AddIn.MyComponent") приволок. А тот ВнешнийОбъект хоть тоже толстяк был, а хииитрый. Аж на самом сишарпе писанный да с дальним вебсервером дружбу водивший. И вот встретились ВнешнийОбъект и скромный работяга наш ОченьНужноеЧисло в вызове метода DoSomething этого самого ВнешнийОбъект. И говорит ВнешнийОбъект: "А не метнуться ли тебе ОченьНужноеЧисло для родной процедуры в цылыэровое царство в веб-государство позвать очень важный результат? Только помни - от твоего значения зависит - согласится ли очень нужный результат к вам в процедуру прийти или нет". Недолго думал ОченьНужноеЧисло - а как тут отказаться рядом ни дядьки Если не было ни причин исключение вызвать. Собрался он и по карте, выданной ВнешнийОбъект в путь двинулся. Так и стал он параметром.
Быстро сказка сказывается, да не быстро маршаллинг делается. Оказалось, что идти надо через лес COM-объектов, а родная 1С говорит на совсем непонятной для COM компонентной модели и даже базовые типы, хоть и похожи - да не те. Пограничники осмотрели ОченьНужноеЧисло и говорят: "Эх браток, покидаешь ты SCOM модель - надо б тебе загранпаспорт дать, а то эти COMовцы глупые - не признают числа-то в тебе. Того и глядишь до Access Violation недалеко". И отправился наш герой за паспортом. Походил по кабинетам: там печать поставил, здесь проверочку прошёл, но дали ему паспорт. В паспорте не по-нашему написано "VT_VARIANT" да приписочка "VT_R8". Посмотрел он на себя в зеркало: чудом избежал некорректного преобразования! (На этой стадии очень часто разработчики не обращают внимание на потерю точности параметра при преобразовании из-за разницы внутреннего представления числа в 1С и "VT_R8") Побегать еще маленько по стекам пришлось, да уж такова судьба параметра.
Вышел он в COM, посмотрел на карту, а там указана гостиница COM Interop. Осмотрелся он вокруг, а местность хоть и незнакомая - всё IUnknown да IDispatch кругом, даже GUIDы как-то не так выглядят (В БД 1С действительно гуиды не очень обычно хранятся, да ведь нашему ОченьНужноеЧисло неизвестно, что весь мир их по-другому хранит) да как-то сориентировался, вышел на ту самую гостиницу.
Ох и дорого встала по цене нашему числу та гостиница! Да еще и кучу времени потерял пока оформлялся. Но та гостиница не просто гостиница была, а по совместительству еще и таможней на границе с цылыэровым царством. Там порядки строгие - госбезопасность чтут. Пока определили кто таков, откуда, не несёт ли запретного чего, не задумал ли переполнение стека вызвать куча времени прошла. ОченьНужноеЧисло уже отчаялся ждать, думал - так и сгинет то ли в куче то ли в стеке. Но всё-таки посовещавшись с самой Domain Security Policy дали ему визу временную и штамп в паспорт, чтобы патруль GC случайно насмерть не забил (а тот патруль - ребята суровые, даже пикнуть деструктором напоследок объекту могут не дать).
Но уж как попал наш товарищ в то заморское царство дело заспорилось: дороги широкие, хоть и помедленне чем в нативном коде, но уж очень указатели понятные. Немало еще пришлось числу по классам побегать. Тут ему и internal функции встречались и свойства всякие. Друзей он за время жизни завёл видимо-невидимо, однако о главной задаче не забывал и нашёл хитрый private метод, который с дальнего сервера очень важный результат с дальнего сервера позвал и в обратную дорогу вместе с параметром снарядил.
Пошли они вместе по стекам, по кучам по возвратам и условным переходам обратно. Обернулись как-то назад и видят - за ними по пятам патруль GC бежит. Бедные объекты, потерявшие ссылки, направо и налево уничтожает. Побежали от патруля наши герои - насилу до границы с COM добрались. Тут уж пока мир на месте стоит и никто из таск менеджера твой поток не прибивает, жить можно хоть годами. Но уж очень они с дороги устали - пришлось снова на границе в COM Interop заночевать. Заодно заново документы пришлось оформлять. Как-никак граница. Еле признали их. Да и Очень важному результату пришлось переодеться из одежды цылыэровой в ту, которая для хождения по лесу COM более удобна. Но потихоньку, помаленьку добрались и до границ родной компонентной модели 1С. Тут уже (хоть и не сразу) дали результату документы одноэсовые. Привёл наш ОченьНужноеЧисло результат, а тот обернулся прекрасным значением Истина. И были они присвоены соседним реквизитам одной записи. Тут же сразу и ЗафиксироватьТранзакцию() сыграли.
И я на том внедрении был, ТЗ утвердил, процедуры кодил. По check-листам прошло, а в отчёт не попало.
И жили эти значения долго и индексированно и dropнуты в один день.

Сказка ложь, да в ней намёк, всем бегиннерам урок.
Tags:
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 20 comments