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:
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 20 comments