Ликбез 7.7: Инициализация переменных во внешнем отчете.

Публикация № 72212

Разработка - Математика и алгоритмы

3
Хотя апологеты самодокументированных программ категорически не рекомендовали передавать в процедуры параметры-ссылки, все же иногда хочется.

Хотя апологеты самодокументированных программ категорически не рекомендовали передавать в процедуры параметры-ссылки, все же иногда хочется. 1С вообще считает, что по умолчанию параметр процедуры должен быть ссылкой.

Но как быть, если требуемый функционал должен реализоваваться внешним отчетом? И таких отчетов требуется вагон и маленькая тележка? Формировать список значений параметров, передавать его, получать значения из списка и загонять в параметры – это обычный метод. Вот и нарисуем соответствующую процедуру для глобального модуля…

Процедура глОтчетСоСсылками(пФайл, СписПар="", пКолСсылок=0, п1="", п2="", п3="") Экспорт

                Перем лИмя;

                Если ПустаяСтрока(пФайл) = 1 Тогда

                               Сообщить("Не задано имя файла отчета!");

                               Возврат;

                КонецЕсли;

                Если ФС.СуществуетФайл(пФайл) = 0 Тогда

                               Сообщить("Не найден файл "+пФайл+" !");

                               Возврат;

                КонецЕсли;

                Если ПустоеЗначение(СписПар) = 1 Тогда

                               СписПар = СоздатьОбъект("СписокЗначений");

                КонецЕсли;

                Если пКолСсылок > 0 Тогда

                    СписПар.ВставитьЗначение(1,п1);

                КонецЕсли;

                Если пКолСсылок > 1 Тогда

                    СписПар.ВставитьЗначение(2,п2);

                КонецЕсли;

                Если пКолСсылок > 2 Тогда

                    СписПар.ВставитьЗначение(3,п3);

                КонецЕсли;

                ОткрытьФормуМодально("Отчет", СписПар, пФайл);

                Если пКолСсылок > 0 Тогда

                    п1 = СписПар.ПолучитьЗначение(1,лИмя);

                КонецЕсли;

                Если пКолСсылок > 1 Тогда

                    п2 = СписПар.ПолучитьЗначение(2,лИмя);

                КонецЕсли;

                Если пКолСсылок > 2 Тогда

                    п3 = СписПар.ПолучитьЗначение(3,лИмя);

                КонецЕсли;

КонецПроцедуры

 

 

Теперь осталось лишь позаботиться о том, чтобы внешний отчет корректно вычислял требуемые величины параметров и заносил их в список в нужные позиции.

 

P.S. Достал меня Владимир. И в самом деле, количество параметров-ссылок вовсе не обязано быть аргументом - если внешнему отчету оно потребуется, его можно передать и по-другому. Но список значений я все же оставлю, ибо не только ссылки, как правило, должны передаваться в отчет...

Итак:

 

Процедура глОтчетСоСсылками(пФайл, СписПар="", п1="", п2="", п3="") Экспорт

                Перем лИмя;

                Если ПустаяСтрока(пФайл) = 1 Тогда

                               Сообщить("Не задано имя файла отчета!");

                               Возврат;

                КонецЕсли;

                Если ФС.СуществуетФайл(пФайл) = 0 Тогда

                               Сообщить("Не найден файл "+пФайл+" !");

                               Возврат;

                КонецЕсли;

                Если ПустоеЗначение(СписПар) = 1 Тогда

                               СписПар = СоздатьОбъект("СписокЗначений");

                КонецЕсли;

                СписПар.ВставитьЗначение(1,п1);

                СписПар.ВставитьЗначение(2,п2);

                СписПар.ВставитьЗначение(3,п3);

                ОткрытьФормуМодально("Отчет", СписПар, пФайл);

                п1 = СписПар.ПолучитьЗначение(1,лИмя);

                п2 = СписПар.ПолучитьЗначение(2,лИмя);

                п3 = СписПар.ПолучитьЗначение(3,лИмя);

 КонецПроцедуры

 

3

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. Арчибальд 2708 25.06.10 12:24 Сейчас в теме
2. hogik 429 25.06.10 20:13 Сейчас в теме
(0)
Лишний текст: "пКолСсылок=0" ;-)

глОтчетСоСсылками(пФайл, СписПар="", п1="", п2="", п3="",..., пN="")
...
СписПар.ВставитьЗначение(1,п1);
СписПар.ВставитьЗначение(2,п2);
СписПар.ВставитьЗначение(3,п3);
...
СписПар.ВставитьЗначение(N,пN);
3. Арчибальд 2708 28.06.10 07:27 Сейчас в теме
(2) пКолСсылок - это не количество параметров, а именно количество "ссылочных" параметров, т.е. которые будут изменяться внешним отчетом. Вставить, конечно, можно и так. Но получить потом значения для присвоения - по количеству.
4. hogik 429 28.06.10 14:00 Сейчас в теме
(3)
Угу. ;-)
А которые НЕ будут меняться надо класть в "СписПар" после трех первых?
Думаю, и текст "СписПар=""," лишний...
5. Арчибальд 2708 28.06.10 14:46 Сейчас в теме
(4) Большое количество существующих внешних отчетов получают в качестве "аргумента" именно список значений - например, стандартные ВПФ, помощники заполнения документов и т.п. И если я захочу в готовом отчете что-то дополнительно сделать, мне не придется ничего разрушать.
Кстати, из такой хотелки и появилась эта процедурка, реально встроенная в одну заказанную мне конфу.
6. hogik 429 28.06.10 15:15 Сейчас в теме
(5) "...в готовом отчете...не придется ничего разрушать"
А цель "Ликбеза": "Формировать список значений парамеров, передавать его, получать значения...". Не понимаю. Жарко у нас... ;-)
Процедура глОтчетСоСсылками(пФайл, п1="", п2="", п3="") Экспорт
                Перем СписПар, лИмя;
                Если ПустаяСтрока(пФайл) = 1 Тогда
                               Сообщить("Не задано имя файла отчета!");
                               Возврат;
                КонецЕсли;
                Если ФС.СуществуетФайл(пФайл) = 0 Тогда
                               Сообщить("Не найден файл "+пФайл+" !");
                               Возврат;
                КонецЕсли;
                СписПар = СоздатьОбъект("СписокЗначений");
                СписПар.ВставитьЗначение(1,п1);
                СписПар.ВставитьЗначение(2,п2);
                СписПар.ВставитьЗначение(3,п3);
                ОткрытьФормуМодально("Отчет", СписПар, пФайл);
                п1 = СписПар.ПолучитьЗначение(1,лИмя);
                п2 = СписПар.ПолучитьЗначение(2,лИмя);
                п3 = СписПар.ПолучитьЗначение(3,лИмя);
КонецПроцедуры
Показать
7. hogik 429 28.06.10 19:10 Сейчас в теме
(0)"...ибо не только ссылки, как правило, должны передаваться в отчет..."
Да, надо передавать список и сразу затирать его другими параметрами... ;-)
8. hogik 429 28.06.10 22:40 Сейчас в теме
(0)
Александр.
Жара у нас спала? ;-)
Задаю вопрос.
В Вашем первом тексте смысл - поставить параметры-ссылки в начало списка "СписПар", а все остальные параметры-значения поместить в этот список заранее (и потом сдвинуть к концу списка), и тем самым "запретить" их изменение во "внешнем отчете"? Тогда - да. Всё верно. Хотя, думаю, и не имеет большого смысла, т.к. "внешний отчет" всегда должен точно "знать" порядок параметров и "понимать" их смысл в части возможности возвращаемого значения. Ну, а если "внешний отчет" это не "понимает", то это уже к доктору... Или к тексту из (6) сообщения.
9. Арчибальд 2708 29.06.10 07:31 Сейчас в теме
(8) Ну да, такой смысл я и вкладывал. В особенности, с учетом того, что во внешних "стандартных" отчетах манипуляция параметрами происходит по именам, а не по позициям (Установить/Получить).
Поясню еще свою позицию насчет количества ссылок. В давние Фортрановские времена слиталось опасным обращаться к процедуре с числовым литералом в качестве параметра, поскольку некоторые трансляторы все литералы превращали в константы и передавали их адреса. В результате после вызова SQRT(3) далее можно получить 2*3 = стеариновая свечка. По слухам, из-за подобной ситуации упал Апполон-10 (по другим источникам - из-за точки вместо запятой в операдоре DO).
Так что у меня присутствует генетическое неприятие записи результата "в никуда". Да и по Клипперной практике - удобно первым параметром процедуры/функции всегда иметь количество аргументов :)
10. hogik 429 29.06.10 14:18 Сейчас в теме
(9)
Вот теперь "Ликбез 7.7" "Для новичков" удался. :-)
Только, думаю, новички уже не начинают программировать со среды "1С 7.7".
Да и про "Клиппер" с Фортраном уже не знают...
11. Арчибальд 2708 29.06.10 14:27 Сейчас в теме
(10)
Да и про "Клиппер" с Фортраном уже не знают...
В этом и беда их. Абсолютная зашоренность. Новую платформу считают неким прорывом - это при том, что в программировании с 85 года ("японский вызов - 6 поколение") ничего нового не произошло.
12. ne_en 49 30.06.10 05:02 Сейчас в теме
Пример как я обычно поступаю:

// Запросим пароль
Параметры=СоздатьОбъект("СписокЗначений");
Параметры.Установить("Статус","Отмена");
Параметры.Установить("Пароль","");
Параметры.Установить("ЗаголовокОкна","Пароль на запрет отрицательных остатков по складу");
ОткрытьФормуМодально("Обработка.ВводПароля",Параметры);
Если Параметры.Получить("Статус")="ОК" Тогда
	Если Параметры.Получить("Пароль")<>"123456789" Тогда
		СтатусВозврата(0);
		Предупреждение("Изменения не записаны, изменен параметр разрешения отрицательных остатков по складу. Неправильный пароль.",20)
	КонецЕсли
Иначе
	Предупреждение("Изменения не записаны, изменен параметр разрешения отрицательных остатков по складу. Не введен пароль.",20)
КонецЕсли
Показать



А в обработке (универсальная форма ввода пароля)

Перем Параметры;

//*******************************************
Процедура Отменить()
	Параметры.Установить("Статус","Отмена");
	Параметры.Установить("Пароль","");
	СтрокаДействийФормы="#Закрыть";
КонецПроцедуры

//*******************************************
Процедура Выполнить()
	Параметры.Установить("Статус","ОК");
	Параметры.Установить("Пароль",Пароль);
	СтрокаДействийФормы="#Закрыть";
КонецПроцедуры

//*******************************************
Процедура ПриОткрытии()
	Параметры=Форма.Параметр;
	Если ПустоеЗначение(Параметры)=1 Тогда
		СтатусВозврата(0);
		Возврат
	КонецЕсли;
	Если ТипЗначенияСтр(Параметры)<>"СписокЗначений" Тогда
		СтатусВозврата(0);
		Возврат
	КонецЕсли;
	ЗаголовокОкна=Параметры.Получить("ЗаголовокОкна");
	Если ПустоеЗначение(ЗаголовокОкна)=1 Тогда
		ЗаголовокОкна="Ввод пароля"
	КонецЕсли;
	Форма.Заголовок(ЗаголовокОкна,0)
КонецПроцедуры
Показать


Так же я поступаю при вызове отчетов и обработок. Все просто и глобальную процедуру(функцию) можно нарисовать на раз два... Но надо ли оно...
13. Арчибальд 2708 30.06.10 08:04 Сейчас в теме
(12) Я когда пишу конфу "с нуля", начинаю с полудюжины любимых глобальных процедур, одна из которых - глВычислитьВнешний. Гораздо меньше одинаковых кусков писать приходится.
14. sss999 38 30.06.10 10:01 Сейчас в теме
Рассказ про апплон кончно скрасил статью),вот интересно а какие параметры передаете,что так ускоряет работу?единственно такой отчет не буде работать в друой конфигурации.
15. Арчибальд 2708 30.06.10 10:25 Сейчас в теме
(14) Это не отчет, а добавочка к глобальному модулю, которую полезно иметь при расширении функционала внешними отчетами с "перекрестными" вызовами.
16. ne_en 49 01.07.10 06:50 Сейчас в теме
(15) Посмотрел свои внешние отчеты с "перекрестными" вызовавами... В подавляющем большинстве случаев не обхожусь я тремя параметрами (ну это мелочи, но до коих пор расширять то список параметров...), а при выходе из обработки, чаще всего нужно для начала проанализировать один параметр (иногда два), что бы уже не получать значения остальных. При вот такой "глобализации" же приходится сначала получить значения всех параметров (даже тех, что не рассчитывались, а это бывают и списки и таблицы данных), а только после этого выяснять, нужно ли чего-то с ними делать или у обработки был отказ (ошибочные параметры/данные или пользователь отказался от каких-то действий). А ещё часть параметров нужно передать только туда, а обратно они не нужны (ну взять хотя бы ДатаНачала, ДатаКонца, а круче ТаблМПЗ), при этом на все эти возвраты требуется расходование процессорного времени и иногда значительного, а на сервере терминалов где одновременно может работать пара-тройка десятков пользователей такие вещи уже имеют значение. Вот всем этим (особенно экономией процессорных мощностей) и обусловлен мой выбор "индивидуального подхода" при передаче и получении параметров в отчеты и обработки, при этом совершенно не сложно заниматься копипастингом или создать шаблон(ы).

Выше сказанное не означает, что Ваш алгоритм непригоден, для него есть своя ниша функционала, и в небольших организациях, где работает не много пользователей, такой расход процресурсов не будет играть существенной роли, заставляющей раньше переходить на более дорогие сервера или даже на распределение нагрузки между несколькими серверами (и более "крутого" админа) для комфортной работы с базой данных.
Пожалуй я поддержу автора, но с оговоркой, что использование его ограниченно в связи с часто нерациональным использованием процресурсов.
Арчибальд; +1 Ответить
17. Арчибальд 2708 01.07.10 07:31 Сейчас в теме
(16) Отличный комментарий. Подписуюсь под каждым словом. Особенно
а при выходе из обработки, чаще всего нужно для начала проанализировать один параметр (иногда два)
У меня, на самом деле, в глобальнмке стоит функция, выдающая результат работы внешнего отчета, и до прошлого года ее (т.е. одного результата) хватало.
И, конечно же, использование внешних отчетов вместо внутренних процедур/функций жрет ресурсов немерено...
Оставьте свое сообщение

См. также

.NET(C#) для 1С. Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия 51

Статья Программист Нет файла v7.7 v8 Windows Бесплатно (free) Разработка внешних компонент Математика и алгоритмы

Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия, а так же генерация модулей на C# и 1С для подключения к событиям. Использование DynamicMethod и ILGenerator. Представлены примеры для использовании событий System.IO.FileSystemWatcher (Ожидает уведомления файловой системы об изменениях и инициирует события при изменениях каталога или файла в каталоге.) и SerialPort (обработка сканера штрих кода подключенного к COM порту). Обертка позволяет использовать классы .Net только на языке 1С. Реализация 1C Messenger описанного здесь http://infostart.ru/public/434771/

12.11.2015    41659    Serginio    35       

Заполнение списков для отборов в отчетах и обработках 4

Статья Программист Бухгалтер Нет файла v77::ОУ v77::БУ v77::Расчет 1cv7.md Россия Бесплатно (free) Математика и алгоритмы

Когда нужно побыстрому навоять простенький отчетик с парой отборов значений, то я использую давно созданный набор.

01.07.2010    8969    ne_en    8       

УРБД, типы миграции (Буферные документы, буферные элементы) 7

Статья Программист Нет файла v77::ОУ v77::БУ v77::Расчет 1cv7.md Россия Бесплатно (free) Распределенная БД (УРИБ, УРБД) Математика и алгоритмы

Часто при использовании стандартного механизма УРБД в 1С:Предприятии 7.7 нехватает типа миграции "центр и место назначения". Данная статейка излагает лишь возможный принцип решения данной проблемы.

08.06.2009    9037    Bosma    4       

Как определить путь к Информационной Базе? 7

Статья Бухгалтер Нет файла v7.7 1cv7.md Россия Windows Бесплатно (free) Математика и алгоритмы

Мне приходится общаться с бухгалтерами, которые работают не в соседней комнате, а в соседней области. Бухгалтера часто слабо разбираются в нюансах работы с файловой системой, поэтому вопрос о том, в каком каталоге находится база данных 1С, ставит бухгалтеров в тупик.

13.03.2009    72111    anempadest    26       

OLE в 1С-Предприятии 45

Статья Программист Нет файла v7.7 1cv7.md Windows Бесплатно (free) Математика и алгоритмы 1С7.7<->1C7.7

Небольшая инструкция с примерами - как работать с OLE

09.08.2008    28482    Minotavrik    8       

1С:Конвертация данных: Способ переноса дерева элементов справочников между разнородными конфигурациями. 6

Статья Программист Нет файла v7.7 1cv7.md КД Windows Бесплатно (free) Математика и алгоритмы Обмен через XML 1С7.7<->1C7.7

Данная задача возникает когда необходимо перенести справочники между конфигурациями у которых различается количество уровней. Например, количество уровней в справочнике "Номенклатура" в конфигурации "Торговля и Склад" - 5, а в конфигурации "Бухгалтерия" - 4. Самое простое решение - отбросить реквизит "Родитель" элементов справочника при выгрузке, но есть способ элегантнее. В данном случае мы не обсуждаем возможность изменения структуры справочника в базе-приемнике конфигурации "1С:Бухгалтерия".

23.06.2008    11366    api.vl    2       

Много общих журналов + гибкие закладки 13

Статья Программист Нет файла v7.7 1cv7.md Windows Бесплатно (free) Обработка документов Математика и алгоритмы Работа с интерфейсом

Общий журнал в ТиС имеет удобный механизм отбора, однако, жальба, что из меню можно открыть только один его экземпляр. Исправляем... А также добавляем "гибкие" закладки.

21.10.2007    14092    Shaman100M    20       

Что такое ТА - точка актуальности итогов 38

Статья Программист Нет файла v77::ОУ 1С7:ТиС Россия Бесплатно (free) Математика и алгоритмы

Статья посвящена точке актуальности итогов - одному из важнейших понятий компоненты "Оперативный учет".

04.05.2007    41437    adv73    31       

Продвинутая технология внешних печатных форм 60

Статья Программист Нет файла v7.7 1cv7.md Windows Бесплатно (free) Универсальные печатные формы Математика и алгоритмы

Технология позволяет создавать внешние печатные формы на основе существующих встроенных с минимальными изменениями кода и макета таблицы. Ввод в печатные формы и запоминание в базе любой дополнительной информации без проблем с обновлением конфигурации.

18.02.2007    25166    clappa    10       

Печатные формы для 1С:Бухгалтерии (примеры к статье "Продвинутая технология внешних форм") 88

Инструменты и обработки Программист Внешняя обработка (ert,epf) v7.7 1cv7.md Windows Бесплатно (free) Универсальные печатные формы Математика и алгоритмы

Технология позволяет создавать внешние печатные формы на основе существующих встроенных с минимальными изменениями кода и макета таблицы. Ввод в печатные формы и запоминание в базе любой дополнительной информации без проблем с обновлением конфигурации.

18.02.2007    17910    975    clappa    16       

Методическое пособие "Основные объекты" 93

Статья Программист Нет файла v7.7 1cv7.md Россия Бесплатно (free) Математика и алгоритмы

Методические пособие для начинающих программистов в среде 1С:Предприятие 7.7.

09.10.2006    14370    GROOVY    29       

Учет материалов по принципу LIFO/FIFO в типовой бухгалтерии 7.7 ред. 4.5 5

Статья Программист Нет файла v7.7 1С7:ТиС 1С7:ПУБ Россия БУ УУ Учет ТМЦ Бесплатно (free) Математика и алгоритмы

Описание идеи реализации учета материалов по принципу FIFO/LIFO в типовой бухгалтерии без внесения изменений в конфигурацию посредством пересчета данных внешней обработкой и формирования корректирующих проводок

24.05.2006    12114    Timesoft    4