arefaste/1C_Forums huggingface dataset:
Всем привет! Есть отчет на СКД. Есть вычисляемое поле, которое является ресурсом. Нужно сделать так, что если по ресурсу в итогах ноль, выводилась не пустота, а "0". Если я в вычисляемых полях, в оформлении делаю формат ЧН=Ноль, то выводится "0" по всем строкам, а в итогах по группировке все равно пусто..
---
Дело скорее всего в формуле вычисляемого поля что бы точно было 0 необходимо оформить его (или составные части этого выражения) в конструкцию ЕстьNull()
---
попробуй сделать формат переменной с заданными длиной и точностью
---
попробуй сделать формат переменной с заданными длиной и точностью Какой именно нужен формат? У меня почему то нули отображаются по строкам, а в группировках нет. Хотя надо все наоборот.
---
В конструкторе схемы на вкладке настройка (последняя вкладка).

Если не получится, то придется использовать макеты для группировки.
---
Спасибо! Добавила. Но! Почему то в группировке не выводит. Странно, хотя я выбрала <Везде>
---
Дело скорее всего в формуле вычисляемого поля что бы точно было 0 необходимо оформить его (или составные части этого выражения) в конструкцию ЕстьNull()
---
В вычисляемом поле не может быть null, я его ввела просто пустым, а потом уже в ресурсах делю одно поле на другое.
---
Дело скорее всего в формуле вычисляемого поля что бы точно было 0 необходимо оформить его (или составные части этого вы все таки это помогло, я только не ноль вывела, а "0".
Пропустили момент, когда контрагенты стали шарашить в электронной накладной наименование номенклатуры в кавычках.
Как следствие в справочнике номенклатуры несколько сотен полных и кратких наименований номенклатуры заключенных в кавычки. Бардак.

Казалось бы ерунда делов, есть же - Универсальный подбор и обработка объектов 1С 8.3
Но не тут то было.

Объект.Наименование = СтрЗаменить(Объект.Наименование, """, "");
Объект.НаименованиеПолное = СтрЗаменить(Объект.НаименованиеПолное, """, "");
Объект.Записать();

- Не работает. Говорит:
ошибка компиляции при вычислении выражения или выполнении фрагмента кода
Пропущен символ "" (двойная кавычка)

Как быть в таком случае?
---
СтрЗаменить(Объект.Наименование, """", "");
---
```1c
    Объект.Наименование = СтрЗаменить(Объект.Наименование, Символ(34), ");
```
 Вот так попробуйте
---
Правильно, привлеку внимание автора вопроса именно 4 кавычки а не 3 так как кавычку внутри текста нужна делать двойной
---
```1c
    Объект.Наименование = СтрЗаменить(Объект.Наименование, Символ(34), ");
```
 Вот так попробуйте
---
СтрЗаменить(Объект.Наименование, """", "");
---
Правильно, привлеку внимание автора вопроса именно 4 кавычки а не 3 так как кавычку внутри текста нужна делать двойной
---
Господа, спасибо большое, оба способа работают.
А если задачу немного усложнить, скорее уже из спортивного интереса и для самообразования?

Есть некоторая номенклатура, содержащая легитимные кавычки. Например:
"Пакет "Средний" с ручками"
Есть ли способ убрать кавычки в начале и конце, оставить в теле наименования?
---
Есть.

```1c
    СтрокаБезКавычек = СтрЗаменить("_"+СтрЗаменить(СокрЛП(СтрокаСКавычками) + "_", ""_", "), "_"", ");
```
Простой отчет на СКД рассылающий данные по электронной почте данные получателям в разынх странах, в т.ч. и "немцам". Как сделать что бы язык вывода заголовков полей и отчета выводился на языке "немца" . ("немцы" разные)? Где в схеме компоновки харнится "язык" макета вывода?
---
```1c
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    Локализация.ПеревестиМакетКомпоновкиДанных(МакетКомпоновки); //УПП для Украины
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);
    ///////////////Локализация.ПеревестиМакетКомпоновкиДанных////////////
    Для Каждого ОписаниеМакетаОбластиМакетаКомпоновкиДанных Из МакетКомпоновкиДанных.Макеты Цикл
    Для Каждого СтрокаТаблицыОбластиКомпоновкиДанных Из ОписаниеМакетаОбластиМакетаКомпоновкиДанных.Макет Цикл
    Для Каждого ЯчейкаТаблицыОбластиКомпоновкиДанных Из СтрокаТаблицыОбластиКомпоновкиДанных.Ячейки Цикл
    Для Каждого ПолеОбластиКомпоновкиДанных Из ЯчейкаТаблицыОбластиКомпоновкиДанных.Элементы Цикл
```
---
```1c
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    Локализация.ПеревестиМакетКомпоновкиДанных(МакетКомпоновки); //УПП для Украины
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);
    ///////////////Локализация.ПеревестиМакетКомпоновкиДанных////////////
    Для Каждого ОписаниеМакетаОбластиМакетаКомпоновкиДанных Из МакетКомпоновкиДанных.Макеты Цикл
    Для Каждого СтрокаТаблицыОбластиКомпоновкиДанных Из ОписаниеМакетаОбластиМакетаКомпоновкиДанных.Макет Цикл
    Для Каждого ЯчейкаТаблицыОбластиКомпоновкиДанных Из СтрокаТаблицыОбластиКомпоновкиДанных.Ячейки Цикл
    Для Каждого ПолеОбластиКомпоновкиДанных Из ЯчейкаТаблицыОбластиКомпоновкиДанных.Элементы Цикл
```
Здравствуйте! Такая ситуация....в 2010 у сотрудника 28 дней отпуска, соответственно отпуск он разбивал по несколько дней, я написал небольшой отчет который группирует года за который предоставляются отпуска, вид ежегодного отпуска и суммирует сколько дней отпуска потрачено, НО! количество дней в год у меня тоже суммируется. Мне надо чтобы было не 84 а 28! подскажите как это исправить?
---
Там в СКД для реквизита есть суммировать ПО
---
прописал на влкдаке ресурсы Сумма(КоличествоДнейВГод)/Количество(КоличествоДнейВГод) и все стало нормально
---
Там в СКД для реквизита есть суммировать ПО
---
а точнее не подскажете? я нашел на вкладке ресурсы нечто подобное.
---
прописал на влкдаке ресурсы Сумма(КоличествоДнейВГод)/Количество(КоличествоДнейВГод) и все стало нормально
---
Ну, типа того :-)
Добрый день. Мне нужно вставить дату конкретно в данную ячейку (конкретно [ДатаДоговора]). Подскажите пожалуйста что дописать, сам не программист, но сделать надо как можно быстрее. Уверен что дело плёвое.
Скрин прилагается
---
Тип у ячейки сделать вид - параметр, в написать в параметр "ДатаДоговора"
---
в коде заполнения макета надо добавить установку этого параметра
---
а как указать, как переменную нужную дату?
---
ановку этого параметр
у него и так параметр заполнен в данной секции
---
Тип у ячейки сделать вид - параметр, в написать в параметр "ДатаДоговора"
---
Большое спасибо, Анатолий!
Вопрос в следующем. Имеется 2 активные скидки - акция и компенсация. Акция должна срабатывать только в разрезе ценовых групп, а компенсация должна распространяться по всем остальным строчкам документа. Как это сделать? На данный момент сумма скидки по акции плюсуется с компенсаций, а так не должно быть, должна в приоритете браться только акция, а компенсация на оставшиеся строки. На данный момент настройки такие:

Акция - http://photo.qip.ru/users/ferzz/200726295/215060404/full_image/
Компенсация - http://photo.qip.ru/users/ferzz/200726295/215060405/full_image/

Группы доступа и суммы - http://photo.qip.ru/users/ferzz/200726295/215058751/full_image/ как видно, у нас плюсуется к акции компенсация.

Там правда сейчас группа доступа на сумму стоят, но я пробовал разные, эффект все равно не тот что нужен.

Как нужно настроить в моем случае?

Какие мои действия?
---
1. Открываете группу "Дистрибьюторы_акции"
2. Нажимаете F1.
3. Читаете раздел "Правила совместного применения скидок (наценок)".
4. У вас вероятно "Суммирование". Вам надо всегда ставить "Акцию", а если она не применилась, то "Компенсацию" независимо от того какая скидка больше? Подойдет "Вытеснение".
---
Есть решения?
---
1. Открываете группу "Дистрибьюторы_акции"
2. Нажимаете F1.
3. Читаете раздел "Правила совместного применения скидок (наценок)".
4. У вас вероятно "Суммирование". Вам надо всегда ставить "Акцию", а если она не применилась, то "Компенсацию" независимо от того какая скидка больше? Подойдет "Вытеснение".
Есть конфигурация общепит. Немного доработанная.
Недавно была обновлена на последний релиз.

При подборе в видах меню начала выскакивать ошибка: "Ошибка отображения типов: Отсутствует отображение для типа 'ДинамическийСписок'"

Ошибка вылезает при подборе в процедуре ОбработкаПодбора(Список, ВыбранноеЗначение, ТекстОшибки);

Причем код обработчика совершенно идентичен коду из предыдущего релиза, где все работает без проблем
---
Косяк нашелся
1с-ники в новом релизе установили режим совместимости "Не использовать". А процедуру подбора не поправили.

При таком режиме динамический список на сервер передавать нельзя.
---
Косяк нашелся
1с-ники в новом релизе установили режим совместимости "Не использовать". А процедуру подбора не поправили.

При таком режиме динамический список на сервер передавать нельзя.
Здравствуйте! ситуация такая. есть отчет на скд.

вот код запроса:

```1c
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    ЗаработанныеПраваНаОтпуска.ДатаНачала КАК ДатаНачала,
    ЗаработанныеПраваНаОтпуска.ДатаОкончания КАК ДатаОкончания,
    ПоложенныеВидыЕжегодныхОтпусков.КоличествоДнейВГод КАК КоличествоДнейВГод,
    ПоложенныеВидыЕжегодныхОтпусков.ВидЕжегодногоОтпуска.Ссылка КАК ВидЕжегодногоОтпуска,
    ЗаработанныеПраваНаОтпуска.Сотрудник.Ссылка КАК Сотрудник,
    ВЫБОР
    КОГДА ФактическиеОтпуска.РабочийПериодС <= ЗаработанныеПраваНаОтпуска.ДатаНачала
    И ФактическиеОтпуска.РабочийПериодПо >= ЗаработанныеПраваНаОтпуска.ДатаОкончания
    ТОГДА ФактическиеОтпуска.Количество
    ИНАЧЕ NULL
    КОНЕЦ КАК ДнейОтпускаПотрачено
    ИЗ
    РегистрСведений.ЗаработанныеПраваНаОтпуска КАК ЗаработанныеПраваНаОтпуска
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ФактическиеОтпуска КАК ФактическиеОтпуска
    ПО ЗаработанныеПраваНаОтпуска.Сотрудник.Ссылка = ФактическиеОтпуска.Сотрудник.Ссылка
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПоложенныеВидыЕжегодныхОтпусков КАК ПоложенныеВидыЕжегодныхОтпусков
    ПО ЗаработанныеПраваНаОтпуска.ВидЕжегодногоОтпуска.Ссылка = ПоложенныеВидыЕжегодныхОтпусков.ВидЕжегодногоОтпуска.Ссылка
```

Ниже приложен скрин отчета:

как мне сделать группировку по дате начала, дате окончания и виду ежегодного отпуска чтобы строка была одна?
---
для тех кому поможет в скд на вкладке настройки требуется указать необходимые группировки.
---
отбой вопросу) разобрался=)
---
для тех кому поможет в скд на вкладке настройки требуется указать необходимые группировки.
---
бывает - спросил и сам ответил !
Подскажите как открыть форму документа?
Ситуация - Создаю и заполняю два документа на сервере, как теперь их открыть и показать пользователю?
У меня наверное самая большая проблема как передать из на клиента...
---
1. НаСервере помещаете ваш документ в ХранилищеЗначений:

```1c
    СсылкаВХранилище = ПоместитьВоВременноеХранилище(ФайлДанных);
```

2. НаКлиенте получаете файл из Хранилища:

```1c
    ПутьКФайлу = ПолучитьИмяВременногоФайла("xlsx");
    ДанныеФайла = ПолучитьИзВременногоХранилища(СсылкаНаФайлВХранилище);
    ДанныеФайла.Записать(ПутьКФайлу);
```
---
по ссылке.
---
заполняю не значит записываю, т.е. ссылки может и не быть.

возможно запись будет выполнять пользователь на клиенте, а извращения с получитьссылкунового() рановато будет при такой постановке задачи
---
а если ты не записал на сервере, то и передавать нечего. У меня не получилось по крайне мере.
Переписывай алгоритм на клиенте.
---
1. НаСервере помещаете ваш документ в ХранилищеЗначений:

```1c
    СсылкаВХранилище = ПоместитьВоВременноеХранилище(ФайлДанных);
```

2. НаКлиенте получаете файл из Хранилища:

```1c
    ПутьКФайлу = ПолучитьИмяВременногоФайла("xlsx");
    ДанныеФайла = ПолучитьИзВременногоХранилища(СсылкаНаФайлВХранилище);
    ДанныеФайла.Записать(ПутьКФайлу);
```
---
Нашел решение своего вопроса!
Метод в (2) подойдет автору, но для меня требовалось немного другое и решение найдено тут: https://infostart.ru/public/118784/
---
По хорошему, в модуле объекта документа должна быть реализована процедура ОбработкаЗаполнения.
Например:

```1c
    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)

    Если ДанныеЗаполнения = "Тест" Тогда
    Комментарий = "это данные заполнения";
    КонецЕсли;

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

Тогда можно выполнить на клиенте код, в результате которого отработает заполнение документа:

```1c
    ОткрытьФорму("Документ.Документ1.ФормаОбъекта", Новый Структура("Основание", "Тест"));
```

Второй вариант, если по каким то причинам первый нельзя реализовать:

```1c
    &НаСервере
    Процедура ОбработкаЗаполненияОбъектаФормы(ОбъектФормы)

    ОбъектФормы.Комментарий = "Команда заполнения";

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

    &НаКлиенте
    Процедура КомандаЗаполнения(Команда)

    ФормаДокумента = ПолучитьФорму("Документ.Документ1.ФормаОбъекта");
    ОбъектФормы = ФормаДокумента.Объект;

    ОбработкаЗаполненияОбъектаФормы(ОбъектФормы);

    КопироватьДанныеФормы(ОбъектФормы, ФормаДокумента.Объект);
    ФормаДокумента.Открыть();

    КонецПроцедуры
```
---
так он спрашивал как на сервере заполнить и только потом выходить на клиент?
Естественно код заполнения будет отсутствовать.

Я когда писал свой код делал запись для передачи на клиент с нужным гуидом. Возможно есть метод открытия новой формы с заданным гуидом, тогда запись не нужна будет?
Во сколько бы вы оценили разработку новой конфигурации на платформе 8.3 управляемые формы. В конфигурации согласно ТЗ получилось 15 справочников, 5 документов, 5 отчетов + объекты, которые появятся после интеграции подсистем БСП. Никаких особо-сложных алгоритмов расчета нету. Решение писать новую конфу было принято в связи с отсутствием готовых решений, которые удовлетворяли бы требованиям организации. Я понимаю, что без конкретики точную цену не определить, но хотя бы порядок цен какой?
---
Имхо попробуйте просчитать примерно затраченное время на разработку. От этого и стоит исходить. Час работы думаю разнится по регионам
---
Ну да, тяжело сказать. Мне тоже часто выдают ТЗ со словами - у нас все просто. А как начнешь разбираться - так работы на месяц с головой :-) Точка зрения обычного пользователя и программиста разная. Тут у меня, например, новое ТЗ вчера прислали - разработать систему поиска на видео человека и определения цвета его одежды (определенных частей тела) - для Заказчика - делов-то на день - все же просто - на видео - вот человек; вот - его цвет. А с точки зрения программиста? ........... :-)- - так что работы мне на месяц.
---
Имхо попробуйте просчитать примерно затраченное время на разработку. От этого и стоит исходить. Час работы думаю разнится по регионам
---
Похоже, придется так и сделать. Ничего другого в голову не приходит.
---
И не забудьте умножить на три.
---
Сформируйте техзадание и отправьте основным потенциальным исполнителям с запросом ожидаемой стоимости работ, нам тоже будет интересно какие у вас будут результаты :)
---
Была такая идея, но как по мне - слишком заморочная
Добрый день. Имеется несложной отчет созданный с помощью СКД. Скрины прилагаю. Нужно распечатать отчет. при печати через стандартную кнопку "печать" (см.Скрин) отчет на бумаге не влезает по ширине на лист А4. Собственно не могу понять технологию как правильно сделать печать.

Нужно создавать процедуру в модуле менеджера, которая будет формировать табличный документ? (т.е. дублировать запрос в модуле), а затем создавать процедуру вывода табдок на форму, а на форме делать кнопку "табдок.Напечатать()"?? Или есть какие либо более простые(удобные варианты)

Конфигурация самописная, (с типовой никаких модулей и т.п. не использовал)

Платформа 8,3,7

Если кого рассмешил вопросом, сорри. Пытался найти ответ в гугле, но толкового ответа не нашел.
---
Добрый день. А параметры страницы - по ширине листа, или "Уместить все на одной странице" - не пробовали так?
---
Сначала сделайте щелчок мышкой по содержимому отчета, чтобы 1с точно знала что вы будете печатать, потом посмотрите на самый левый верхний угол окна 1с, там оранжевый треугольник с черной стрелочкой, сделайте щелчок по нему, откроется главное меню, там файл-параметры страницы...
---
Дополню ваш ответ картинкой :)
---
много букв писать, это не то что вы ищете?
https://forum.infostart.ru/forum9/topic54500/
---
Добрый день. А параметры страницы - по ширине листа, или "Уместить все на одной странице" - не пробовали так?
---
Что-то не нахожу таких параметров. Прилагаю скрин выбора принтера. Если речь идет о настройках страницы, то я так понимаю они есть в типовой, а у меня самописная. Если не прав поправте
---
Сначала сделайте щелчок мышкой по содержимому отчета, чтобы 1с точно знала что вы будете печатать, потом посмотрите на самый левый верхний угол окна 1с, там оранжевый треугольник с черной стрелочкой, сделайте щелчок по нему, откроется главное меню, там файл-параметры страницы...
---
Дополню ваш ответ картинкой :)
---
Спасибо за дополнение. Повторю, что написал выше: При перезапуске сбрасывается галка "по ширине страницы". Можно как-то установить значение по умолчанию??
---
елайте щелчок мышкой по содержимому отчета, чтобы 1с точно знала что вы будете печатать, потом посмотрите на самый левый верхний угол окна 1с, там оранжевый треугольник с черной стрелочкой, сделайте щелчок по нему, откроется главное меню, там файл-параметры стр

Спасибо, не обращал внимание на наличие данной фичи. Только при перезапуске сбрасывается галка "по ширине страницы". Можно как-то установить значение по умолчанию??

Просто каждый раз выбирать - это вообще не вариант :(
---
много букв писать, это не то что вы ищете?
https://forum.infostart.ru/forum9/topic54500/
---
Спасибо. Все получилось
Общий смысл в заголовке темы, а мешает эта вещь тем, что если на основне этого заказ наряда создать передачи товаров в ремонт, то закрыть заказ наряд раньше чем через час без изменении времени документа не получится. Рабочий процесс построен таким образом, что такая проблема возникает постоянно. Подскажите пожалуйста как это решить. И зачем это вообще было сделано.
---
Нашёл в чём была проблема, время на сервере было установлено на час больше.
Другими словами при переводе в состояние "В работе" время документа устанавливается в соответствии с серверным временем. А в остальные состояния с клиентского компьютера. Спасибо за помощь!
---
И зачем это вообще было сделано. Возможно, что это вообще не "было сделано", а "сделали" это вы сами. Или кто там у вас сисадмин.

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

И тогда один пользователь создает документ с одним временем, а другой, со своими настройками, при его программной записи меняет это время.

Если это все не так, то извините - как у вас организована работа с базой, вы не написали.
---
Тоже сначала так подумал, но это происходит с 5 разных компьютеров, везде windows 10, с одинаковыми часовыми поясами.
Документ создаётся и редактируется с одного и того же компьютера, под одним и тем же пользователем. Время перескакивает только при изменении на статус:
"в работе" с остальными статусами изменение времени документа не происходит.
---
Документ создаётся и редактируется с одного и того же компьютера, под одним и тем же пользователем. Время перескакивает только при изменении на статус:
"в работе" с остальными статусами изменение времени документа не происходит. Ну, тогда запускайте отладчик и проходите пошагово процедуру изменения статуса - в какой момент происходит принудительное изменение времени? И есть ли оно там вообще?
---
Нашёл в чём была проблема, время на сервере было установлено на час больше.
Другими словами при переводе в состояние "В работе" время документа устанавливается в соответствии с серверным временем. А в остальные состояния с клиентского компьютера. Спасибо за помощь!
Всем привет! На управляемой форме в процедуре есть обращение к функции. Типо такого
ТЗ = ФормированиеСчетов.ВернутьСчет(Перем1);
До захода в функцию Перем1 имеет одно значение. В функции такой код

```1c
    Функция ВернутьСчет(НомерID) Экспорт
    НомерID=ЧислоЛистов-НомерID;
```

При выходе из функции Перем1 уже имеет другое значение. Это нормально? Я всегда думала, что функция ничего не меняет, что она возвращает значение. Спасибо!
---
Это нормально.

Напиши
Функция ВернутьСчет(ЗНАЧ НомерID) Экспорт
и налей кружку водки, чтобы успокоить нервы
---
В 1с в функцию передается не значение переменной а ссылка на переменную, поэтому по ссылке внутри функции можно менять исходную переменную.

И это еще что, говорят функции из модулей с повторным использованием значений вообще интересные вещи творят :)
---
Ну, как сказать нормально...
Это документированное поведение.
Но с точки зрения хорошего стиля программирования - это кошмарная функция. Ее сигнатура ничего не говорит о том, что функция может давать побочные эффекты. Так не принято делать и такой стиль является источником трудноуловимых проблем не только в 1С.
Хорошей практикой для функций является не менять данные параметров и не иметь внешних зависимостей кроме параметров. Так что вполне понятно, почему вы так думали. Меняют обычно в процедурах или чтобы из названия функции и ее параметров было понятно, что она имеет побочные эффекты или на худой конец из комментария...
---
Хорошей практикой для функций является не менять данные параметров и не иметь внешних зависимостей кроме параметров.

Пиши на Лиспе. Там такого нет
---
Пиши на Лиспе. Там такого нет
Да все функциональное программирование на immutability держится.
---
Да наверное так и было. Еще проблема усложнялась тем, что переменная еще меняла свой тип. И вызов этой функции происходил 2 раза. В первый раз это число и все ок, потом значение меняется на другой тип и ошибка. Сейчас вообще не могу понять зачем это все было..
---
Это нормально.

Напиши
Функция ВернутьСчет(ЗНАЧ НомерID) Экспорт
и налей кружку водки, чтобы успокоить нервы
---
Да это еще из Паскаля и Си передаешь в параметр ссылку или значение, ссылка - меняется, значение - нет.
---
передаешь в параметр ссылку или значение

Не пугай даму грубыми словами ))0
---
В 1с в функцию передается не значение переменной а ссылка на переменную, поэтому по ссылке внутри функции можно менять исходную переменную.

И это еще что, говорят функции из модулей с повторным использованием значений вообще интересные вещи творят :)
---
Ок, поняла.
---
такие вопросы на 1-м курсе технических вузов задают и выгонят в первом же семестре при неправильном ответе)
---
я училась в техническом музе, очень хорошо, что мне такой вопрос не задали, а то не видать мне диплома :-)
---
Наверное, ты борщ хорошо готовишь, или другие достоинства имеешь? )))
---
Естественно. Помимо незаурядного ума и профессионализма имею много других достоинств :-)
---
я училась в техническом музе
Прямо по Фрейду...
по классу настройки фортепьяно? :)
---
объявите переменную модуля и меняйте ее в любой функции или процедуре модуля