Структура программного модуля
Прогаммный модуль всегда привязан к какому-либо объекту системы, чаще к интерактивной форме. Трансляция модуля в исполняемый код производится за один проход, поэтому важна последовательность описания переменных и процедур модуля. Его можно поделить на три части: Блок описания переменных модуля, Блок описания процедур и функций модуля и Раздел основной программы модуля.
![](image/image056.gif)
Блок определения переменных модуля. Отделяется от остального текста точкой с запятой.
Блок описаний процедур и функций модуля. Если в теле одной процедуры вызывается другая процедура, то последняя должна быть описана выше по тексту (например: с помощью ключевого слова Далее после описания процедуры).
Раздел основной программы -содержит отдельные операторы, выполняющиеся До открытия интерактивной формы объекта
Упражнение 3(Необязательное) Создайте процедуры в глобальном модуле, которые позволят нам редактировать любые периодические константы с помощью служебных объектов «ТаблицаЗначений», «Периодический» и "Метаданные». В теле процедуры опишем переменные для объектов ТаблицаЗначений и Периодический.
Служебный объект ТаблицаЗначений - позволяет создавать, редактировать и выбирать значения из двумерных массивов.
50_______________________ 1С:Предприятие. Практика программирования на платформе V7
Служебный объект Метаданные - позволяет получить доступ к любому объекту метаданных даже в неизвестной конфигурации. Он является атрибутом Глобального контекста и для него зарезервировано ключевое слово «Метаданные», поэтому его не надо создавать с помощью метода СоздатьОбъект.
1 этап.
Создадим в глобальном модуле процедуру, допустим, История, в которой определим объект типа таблица значений и опишем для него две колонки для записи даты и значения. Для колонок определим идентификаторы и ширину.
Метод
НоваяКолонка (<Идентификатор>,<Тип>,<Длина>,<Точность>,<Заголовок>,<Ширина>,<Формат>,
<Положение>) присоединяет к таблице значений новую колонку справа и возвращает номер новой
колонки.
Параметры: <Идентификатор> - необязательный параметр. Идентификатор колонки. Если не указан,
то обращение к колонке возможно только по номеру.
<Тип> - необязательный параметр. Задает тип колонки. <Длина> - необязательный параметр, определенный для строки или числа. <Точность> - необязательный параметр, определенный только для числа. <3аголовок> - необязательный параметр.
<Ширина> - необязательный параметр. Числовое выражение, содержащее ширину колонки (в символах) для представления колонки. <формат> - необязательный параметр.
<Положение> - необязательный параметр. Определяет вариант выравнивания при визуальном отображении значений данной колонки. Число: 1 - слева; 2 - справа.
Процедура История()
// Просмотр истории периодических объектов ТаблицаЗначений=Создать0бъект("ТаблицаЗначений"); ТаблицаЗначений.НоваяКолонка("Дт",,,,"Дата",11); ТаблицаЗначений.НоваяКолонка("Зн",,,,"Значение",15);
КонецПроцедуры
Создадим объект Периодический, определим, какие периодические константы есть в конфигурации, спозиционируем объект Периодический в цикле на текущую константу, если она периодическая.
Метод Выбран() проверяет спозиционирован ли объект типа "Метаданные" на конкретном объекте метаданных или нет. Возвращает число: 1 - объект соответствует объекту метаданных (спозиционирован), 0 - если не соответствует.
Процедура История()
// Просмотр истории периодических объектов
ТаблицаЗначений=СоздатьОбъект("ТаблицаЗначений");
ТаблицаЗначений.НоваяКолонка("Дт",,,,"Дата",11);
ТаблицаЗначений.НоваяКолонка("Зн",,,,"Значение" , 15) ;
//Найдем периодические Объекты
Периодический=Создать0бъект("Периодический");
// По константам
i = 1;
Пока Метаданные.Константа(i).Выбран()=1 Цикл
VI Пример создания простой реляционной структуры____________________________ 51
//Получим "Имя Константы" в переменной Описатель
Описатель=Метаданные.Константа(i).Идентификатор;
Если Периодический.ИспользоватьОбъект(Описатель)=1 Тогда
// Заполним таблицу значений периодическими значениями
КонецЕсли;
i=i+l;
КонецЦикла;
КонецПроцедуры
2 этап.
Создадим процедуру для заполнения таблицы значений периодическими значениями. Запишем получаемые в цикле значения и даты значений периодической константы в таблицу значений, используя атрибуты служебных объектов Периодический (Значение и ДатаЗнач) и ТаблицаЗначений (НомерСтроки и <ИдентификаторКолонки>).
Метод ВыбратьЗначения(<ДатаНачала>,<ДатаКонца>) открывает выборку периодических значений
по датам и возвращает: 1 - если вызов метода закончился успешно, 0 - иначе. Если даты не заданы, то
выбираются все значения.
Метод ПолучитьЗначение() позволяет получить из выборки следующий элемент и возвращает: 1 -
если элемент выбран, 0 - иначе.
Метод периодического объекта ТекущийРеквизит() возвращает наименование константы или текущего
реквизита справочника. Метод используется после получения очередного значения из выборки.
Метод НоваяСтрока(<НомерСтроки>) добавляет новую строку в таблицу значений.
Параметры:<НомерСтроки> - необязательный параметр. Числовое выражение, содержащее позицию, в
которую следует вставить новую строку.
В этой процедуре определим два параметра: откуда читаем «П», куда пишем «Тз».
Процедура ЗаполнениеТаблицы(Тз,П) П.ВыбратьЗначения();
Пока П.Получитьзначение()=1 Цикл
Тз.НоваяСтрока();
Тз.Дт=П.ДатаЗнач;
Тз.Зн=П.Значение;
Тз.Пар=П.ТекущийРеквизит();
КонецЦикла;
КонецПроцедуры //ЗаполнениеТаблицы
Организуем вызов этой процедуры из процедуры История, отсортируем полученную таблицу значений по дате и вызовем процедуру
52_______________________ 1С:Предприятие. Практика программирования на платформе V7
РедактированиеИстории, в которой будет описан алгоритм просмотра и редактирования периодических элементов.
Метод таблицы значений Сортировать(<Колонки>,<ДокумПоДате>) позволяет сортировать
таблицу значений по колонкам.
Параметры:
<Колонки> - строковое выражение, которое определяет колонки, порядок и направление сортировки.
Формат передаваемой строки - это разделенные запятыми номера или идентификаторы колонок со
знаком направления сортировки ( "+" - сортировать по возрастанию; "- " - сортировать по
убыванию; "*" - сортировать по внутреннему значению). Знак направления сортировки можно
указывать до или после обозначения колонки через пробел или без пробела. По умолчанию
направление сортировки принимается по возрастанию.
<ДокумПоДате> - необязательный параметр. Имеет смысл только в том случае, если значениями
таблицы значений являются документы. В этом случае можно задавать сортировку документов по их
хронологии. Число: 1 - сортировка по хронологии документов; 0 - нет. Значение по умолчанию - 0.
Процедура История() // Просмотр истории периодических объектов
ТаблицаЗначений=Создать0бъект("ТаблицаЗначений");
ТаблицаЗначений.НоваяКолонка("Дт",,,,"Дата",11);
ТаблицаЗначений.НоваяКолонка("Зн",,,,"Значение",15);
ТаблицаЗначений.НоваяКолонка("Пар",,,,"Параметр",15);
//Найдем периодические Объекты
Периодический=Создать0бъект("Периодический");
// По константам
i = 1;
Пока Метаданные.Константа(i).Выбран()=1 Цикл
//Получим "Имя Константы" в переменной Описатель Описатель=Метаданные.Константа(i).Идентификатор;
Если Периодический.ИспользоватьОбъект(Описатель)=1 Тогда
// Заполним таблицу значений периодическими значениями
ЗаполнениеТаблицы(ТаблицаЗначений,Периодический);
КонецЕсли;
i=i+l;
КонецЦикла;
ТаблицаЗначений.Сортировать("Дт");
РедактированиеИстории(Периодический,ТаблицаЗначений);
КонецПроцедуры
3 этап.
В процедуре РедактированиеИстории просмотрим записанные значения в отдельном окне, с помощью метода таблицы значений ВыбратьСтроку(), и
VI Пример создания простой реляционной структуры____________________________ 53
создадим СписокЗначений для того, чтобы можно было выбрать действие над значением из таблицы значений.
ВыбратьСтроку(<Строка>,<Заголовок>,<Таймаут>). Метод открывает окно для интерактивного выбора строки в таблице значений и возвращает число: 1 - если выбор произведен (нажата кнопка OК); 0 - если выбор не произведен (нажата кнопка "ОТМЕНА"); -1 (минус единица) - закончилось время <Таймаут> ожидания отклика пользователя.
Не забудем, что параметры методов, которым передается какое-либо значение при вызове метода, должны быть предварительно явно или неявно описаны; в данном случае это параметр <Строка>. Далее получим строку из таблицы значений и спозиционируем объект периодический на константу и на выбранное значение константы.
Метод таблицы значений ПолучитьСтрокуПоНомеру(<НомерСтроки>) позволяет получить строку таблицы значений по номеру. Указанная строка становится текущей. <НомерСтроки> - номер строки, на которую следует переместиться.
Метод объекта периодический НайтиЗначение(<Дата>,<Режим>) находит периодическое значение на заданную дату.Возвращает: 1 - если вызов метода закончился успешно, 0 -иначе. Параметры:
<Дата> - дата, на которую требуется найти периодический реквизит справочника или периодическую константу;
<Режим> - режим поиска на тот случай, когда на заданную дату не существуе| значения периодического реквизита: -1, возвращается значение на предыдущую дату;
0,возвращается код завершения неуспешной операции;
1,возвращается значение на последующую дату.
Процедура РедактированиеИстории(Периодический,Таблица)
Перем НомерСтр;
Если Таблица. ВыбратьСтроку (НомерСтр/История
периодических объектов")=1 Тогда
Таблица. ПолучитьСтрокуПоНомеру (НомерСтр) ;
Периодический. ИспользоватьОбъект (Строка (Таблица. Пар) ) ;
Периодический.НайтиЗначение(Таблица. Дт, 0 ) ; КонецЕсли; КонецПроцедуры
4 этап.
Определим, что мы будем делать с найденной записью, запишем эти действия в СписокЗначений, организуем выбор действия из списка и выполним выбранное действие для периодического значения, После изменения значения, чтобвы увидеть это изменение, перезаполним ТаблицуЗначений., вызвав процедуру История().
Метод списка значений
ВыбратьЗначение(<Значение>,<Заголовок>,<Позиция>,<Таймаут>,<Способ выбора>) позволяет открыть окно для интерактивного выбора значения из списка.
Возвращает: -1 (минус единица) - закончилось время <Таймаут> ожидания отклика пользователя, 1 -если выбор произведен, 0 - иначе. Параметры: <Значение> - идентификатор переменной, куда помещается результат выбора;
54_______________________ 1С:Предприятие. Практика программирования на платформе V7
<3аголовок> - строка заголовка диалогового окна.
<Позиция> - идентификатор переменной, куда помещается номер позиции выбранного значения в
списке.
<Таймаут> - необязательный параметр. Числовое выражение, значение которого задает время
ожидания системы (в секундах) на отклик пользователя.
<Способ выбора> - необязательный параметр. Число, значение которого задает способ выбора
значения. О - в виде диалога; 1 - выбор производится в виде меню, которое подстраивается по месту
текущего элемента диалога или ячейки таблицы; 2 - выбор маленьким списком (список похож на выбор
значения перечисления), также привязанным к позиции элемента диалога
Значение по умолчанию - 0.
Метод может использоваться только для переменных, созданных функцией СоздатьОбъект.
Процедура РедактированиеИстории(Периодический,Таблица)
Перем НомерСтр, Значение, Позиция;
СписокДействий=Создать0бъект("СписокЗначений");
СписокДействий.ДобавитьЗначение("У","Удалить");
СписокДействий.ДобавитьЗначение("И","Изменить");
Если Таблица.ВыбратьСтроку(НомерСтр,"История периодических
объектов")=1 Тогда
Таблица.ПолучитьСтрокуПоНомеру(НомерСтр);
Периодический.ИспользоватьОбъект(Строка(Таблица.Пар));
Периодический.НайтиЗначение(Таблица.Дт,0);
Если СписокДействий.ВыбратьЗначение(Значение,"Выберите действие",Позиция,,1)=1 Тогда
Если Значение="У" Тогда
Периодический.Удалить();
ИначеЕсли Значение="И" Тогда
Стр=Таблица.Зн;
ДатаЗначения=Периодический.ДатаЗнач;
Если ВвестиПеречисление(Стр,"Введите значение ")<>1 Тогда
Возврат;
КонецЕсли;
Периодический.ДатаЗнач=ДатаЗначения;
Периодический.Значение=Стр;
Периодический.Записать();
КонецЕсли;
КонецЕсли;
VI Пример создания простой реляционной структуры____________________________ 55_
История();
КонецЕсли;
КонецПроцедуры
Мы видим, что у нас процедура РедактированиеИстории вызывается из процедуры История, и, наоборот, процедура История вызывается из процедуры РедактированиеИстории. Поэтому одну из них надо описать перед описанием другой с помощью ключевого слова Далее. Окончательный текст блока будет следующим.
Процедура РедактированиеИстории(Периодический,Таблица) Далее
Процедура ЗаполнениеТаблицы(Тз,П)
П.ВыбратьЗначения();
Пока П.Получитьзначение()=1 Цикл
Тз.НоваяСтрока();
Тз.Дт=П.ДатаЗнач;
Тз.Зн=П.Значение;
Тз.Пар=П.ТекущийРеквизит();
КонецЦикла;
КонецПроцедуры //ЗаполнениеТаблицы
Процедура История() // Просмотр истории периодических объектов
ТаблицаЗначений=Создать0бъект("ТаблицаЗначений");
ТаблицаЗначений.НоваяКолонка{"Дт",,,,"Дата",11);
ТаблицаЗначений.НоваяКолонка("Зн",,,,"Значение",15);
ТаблицаЗначений.НоваяКолонка("Пар",,,,"Параметр",15);
//Найдем периодические Объекты
Периодический=СоздатьОбъект("Периодический");
// По константам
i = 1;
Пока Метаданные.Константа(i).Выбран()=1 Цикл
//Получим "Имя Константы" в переменной Описатель
Описатель=Метаданные.Константа(i).Идентификатор;
Если Периодический.ИспользоватьОбъект(Описатель)=1 Тогда
// Заполним таблицу значений периодическими значениями
56_______________________ 1C:Предприятие. Практика программирования на платформе V7
ЗаполнениеТаблицы(ТаблицаЗначений,Периодический);
КонецЕсли;
i=i+1;
КонецЦикла;
ТаблицаЗначений.Сортировать("Дт");
РедактированиеИстории(Периодический,ТаблицаЗначений);
КонецПроцедуры
Процедура РедактированиеИстории(Периодический,Таблица)
Перем НомерСтр,Значение,Позиция;
СписокДействий=СоздатьОбъект("СписокЗначений");
СписокДействий.ДобавитьЗначение("У","Удалить");
СписокДействий.ДобавитьЗначение("И","Изменить");
Если Таблица.ВыбратьСтроку(НомерСтр,"История периодических объектов")=1 Тогда
Таблица.ПолучитьСтрокуПоНомеру(НомерСтр);
Периодический.ИспользоватьОбъект(Строка(Таблица.Пар));
Периодический.НайтиЗначение(Таблица.Дт,0);
Если СписокДействий.ВыбратьЗначение(Значение,"Выберите действие".Позиция,,1)=1 Тогда
Если Значение="У" Тогда
Периодический.Удалить();
ИначеЕсли Значение="И" Тогда
Стр=Таблица.Зн;
ДатаЗначения=Периодический.ДатаЗнач;
Если ВвестиПеречисление(Стр,"Введите значение ")<>1 Тогда
Возврат;
КонецЕсли;
Периодический.ДатаЗнач=ДатаЗначения;
Периодический.Значение=Стр;
Периодический.Записать();
КонецЕсли;
КонецЕсли;
VI Пример создания простой реляционной структуры____________________________ 57
История();
КонецЕсли;
КонецПроцедуры
Упражнение 4. Вставьте в меню пользовательского интерфейса вызов процедуры История() глобального модуля.
Чтобы процедура История() когда-нибудь выполнилась её надо вызвать.
Для редактирования интерфейса в конфигураторе необходимо открыть окно «Конфигурация» и перейти к закладке «Интерфейсы», для этого достаточно просто щелкнуть мышкой по этой закладке. На экране появится список пользовательских интерфейсов. Каждый интерфейс - это совокупность меню и набора панелей инструментов. Для создания пункта меню, перейдём в режим редактирования меню интерфейса.
Для редактирования пользовательских интерфейсов в Конфигураторе существует 2 специализированных редактора: редактор меню и редактор панелей инструментов. Для вызова редактора меню необходимо:
¨ щелкнуть правой кнопкой мыши на строке с наименованием интерфейса, который требуется отредактировать (у нас в конфигурации этот интерфейс - единственный);
¨ из контекстного меню выбрать строку «Редактировать меню...».
![](image/image057.gif)
В результате этих действий будет открыто окно - «Редактор меню». В котором меню пользовательского интерфейса выводится не в том виде, в котором мы с ним работаем в «1С:Предприятии», то есть не в виде колонок, а в виде дерева, при этом ветви верхнего уровня соответствуют колонкам.
На платформе V77 можно не только создавать новые пункты меню, но и Редактировать системные пункты меню.
58_______________________ 1С:Предприятие. Практика программирования на платформе V7
• Откроем свойства элемента меню <новая колонка...> через контекстное меню и отредактируем его.
![](image/image058.gif)
• Щелкнем крестик слева от пункта меню «Сервис» и откроем двойным
щелчком мыши свойства пункта меню <новый...>.
![]() |
• На закладке «Дополнительно» укажем имя вызываемой процедуры. |
![]() |
Можно ещё отредактировать в палитре свойств поля «Название» и «Подсказка», автоматически заполненные программой, так, чтобы они более наглядно и естественно отражали назначение команды меню. Содержимое поля «Название» будет являться собственно названием команды меню, а содержимое поля «Подсказка» будет выводиться в нижней части экрана (cmamyc-строке) при установке курсора на данный пункт меню. Теперь если нажать кнопку «ОК» - введенная нами команда попадет в нижнюю часть ветви «Сервис». Можно перетащить ее в другое место дерева меню.
VI Пример создания простой реляционной структуры____________________________ 59
Сохраним сделанные изменения и запустим режим Предприятие. Запустим процедуру, выбрав созданный пункт интерфейса.
![](image/image061.gif)
Упражнение 3.1 (дополнительное). Самостоятельно, используя Синтакс-Помошник, отредактируйте алгоритм, описанный в упражнении 3 таким образом, чтобы с помощью него можно было добавить значение в историю периодического элемента.
Упражнение 3.2 (дополнительное). Самостоятельно отредактируйте алгоритм, описанный в упражнении 3.1 таким образом, чтобы с помощью него можно было изменить или значение или дату значения периодического элемента.
Вопросы для самоконтроля
Как создаются новые типы объектов на платформе «1С:Предприятие»?
Почему значения перечислений можно редактировать только в конфигураторе?
Чем отличаются периодические константы от простых констант?
![](image/image062.gif)