1С Предприятие. Практика программирования на платформе v7

  73c64bed     

Структура программного модуля


Прогаммный модуль всегда привязан к какому-либо объекту системы, чаще к интерактивной форме. Трансляция модуля в исполняемый код производится за один проход, поэтому важна последовательность описания переменных и процедур модуля. Его можно поделить на три части: Блок описания переменных модуля, Блок описания процедур и функций модуля и Раздел основной программы модуля.

Блок определения переменных модуля. Отделяется от остального текста точкой с запятой.

Блок описаний процедур и функций модуля. Если в теле одной процедуры вызывается другая процедура, то последняя должна быть описана выше по тексту (например: с помощью ключевого слова Далее после описания процедуры).

Раздел основной программы -содержит отдельные операторы, выполняющиеся До открытия интерактивной формы объекта

Упражнение 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 специализированных редактора: редактор меню и редактор панелей инструментов. Для вызова редактора меню необходимо:

¨        щелкнуть правой кнопкой мыши на строке с наименованием интерфейса, который требуется отредактировать (у нас в конфигурации этот интерфейс - единственный);



¨        из контекстного меню выбрать строку «Редактировать меню...».



В результате этих действий будет открыто окно - «Редактор меню». В котором меню пользовательского интерфейса выводится не в том виде, в котором мы с ним работаем в «1С:Предприятии», то есть не в виде колонок, а в виде дерева, при этом ветви верхнего уровня соответствуют колонкам.

На платформе V77 можно не только создавать новые пункты меню, но и Редактировать системные пункты меню.

58_______________________ 1С:Предприятие. Практика программирования на платформе V7

• Откроем свойства элемента меню <новая колонка...> через контекстное меню и отредактируем его.



•  Щелкнем крестик слева от пункта меню «Сервис» и откроем двойным

щелчком мыши свойства пункта меню <новый...>.



• На закладке «Дополнительно» укажем имя вызываемой процедуры.



•  выберем команду «Задача .Выполнить»;

Можно ещё отредактировать в палитре свойств поля «Название» и «Подсказка», автоматически заполненные программой, так, чтобы они более наглядно и естественно отражали назначение команды меню. Содержимое поля «Название» будет являться собственно названием команды меню, а содержимое поля «Подсказка» будет выводиться в нижней части экрана (cmamyc-строке) при установке курсора на данный пункт меню. Теперь если нажать кнопку «ОК» - введенная нами команда попадет в нижнюю часть ветви «Сервис». Можно перетащить ее в другое место дерева меню.

VI Пример создания простой реляционной структуры____________________________ 59

 Сохраним сделанные изменения и запустим режим Предприятие. Запустим процедуру, выбрав созданный пункт интерфейса.



Упражнение 3.1 (дополнительное). Самостоятельно, используя Синтакс-Помошник, отредактируйте алгоритм, описанный в упражнении 3 таким образом, чтобы с помощью него можно было добавить значение в историю периодического элемента.

Упражнение 3.2 (дополнительное). Самостоятельно отредактируйте алгоритм, описанный в упражнении 3.1 таким образом, чтобы с помощью него можно было изменить или значение или дату значения периодического элемента.

Вопросы для самоконтроля

Как создаются новые типы объектов на платформе «1С:Предприятие»?

Почему значения перечислений можно редактировать только в конфигураторе?

Чем отличаются периодические константы от простых констант?

60_______________________ 1С:Предприятие. Практика программирования на платформе V7


Содержание раздела