1. Команда формы "ЗаполнитьЗапчасти".
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
В качестве источника данных выбран регистр накопления, в который записываются данные о выданных запчастях со склада обменом из БП3.
Реализован алгоритм вывода диалогового окна в случае, если табличная часть документа заполнена.
Первый вариант, с выносом алгоритма диалогового окна в отдельную процедуру:
| 1C | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
| &НаСервере
Процедура ЗаполнитьЗапчастиНаСервере()
// Создаем объект запроса для получения данных из регистра накопления
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МатериалыНаСкладахОстаткиИОбороты.Материал.Ссылка КАК Материал,
| МатериалыНаСкладахОстаткиИОбороты.Материал.Наименование КАК Наименование,
| МатериалыНаСкладахОстаткиИОбороты.КоличествоРасход КАК Количество,
| МатериалыНаСкладахОстаткиИОбороты.Регистратор.Дата КАК РегистраторДата,
| МатериалыНаСкладахОстаткиИОбороты.Регистратор.Ссылка КАК РегистраторСсылка
|ИЗ
| РегистрНакопления.МатериалыНаСкладах.ОстаткиИОбороты(
| ,
| ,
| Регистратор,
| ,
| РесурсЛокации = &Спецтехника
| ) КАК МатериалыНаСкладахОстаткиИОбороты
|ГДЕ
| МатериалыНаСкладахОстаткиИОбороты.Регистратор.Дата >= &Дата";
Запрос.УстановитьПараметр("Дата", Объект.Дата);
Запрос.УстановитьПараметр("Спецтехника", Объект.Спецтехника);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Сообщить("Нет данных для заполнения!");
Модифицированность = Ложь;
Иначе
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.ВыполненныеРаботы.Добавить();
НоваяСтрока.мДата = Выборка.РегистраторДата;
НоваяСтрока.Материал = Выборка.Материал;
НоваяСтрока.Количество = Выборка.Количество;
НоваяСтрока.ОписаниеРабот = Выборка.РегистраторСсылка;
Модифицированность = Истина;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьЗапчасти(Команда)
ОчиститьСообщения();
ТЧ = Объект.ВыполненныеРаботы;
Если ТЧ.Количество() > 0 Тогда
Если Объект.Статус <> ПредопределенноеЗначение("Перечисление.СтатусРемонтаТС.Выполнено") Тогда
ПоказатьВопрос(
Новый ОписаниеОповещения("ЗаполнитьЗапчасти_Ответ", ЭтаФорма),
"Перед заполнением таблица будет очищена. Продолжить?",
РежимДиалогаВопрос.ДаНет
);
Возврат;
Иначе
ТекстСообщения = "Нельзя выполнить данную команду, поскольку заявка уже выполнена!";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
ТекстСообщения,
,
"Статус",
"Объект"
);
Возврат;
КонецЕсли;
КонецЕсли;
ЗаполнитьЗапчасти_Ответ(КодВозвратаДиалога.Да,);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьЗапчасти_Ответ(Результат, ДопПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
Объект.ВыполненныеРаботы.Очистить();
ЗаполнитьЗапчастиНаСервере();
КонецПроцедуры |
|
Второй вариант клиентской процедуры, с алгоритмом диалогового окна внутри команды формы:
| 1C | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| &НаКлиенте
Процедура ЗаполнитьЗапчасти(Команда)
ОчиститьСообщения();
ТЧ = Объект.ВыполненныеРаботы;
Если ТЧ.Количество() > 0 Тогда
Если Объект.Статус <> ПредопределенноеЗначение("Перечисление.СтатусРемонтаТС.Выполнено") Тогда
Ответ = Вопрос("Перед заполнением таблица будет очищена. Продолжить?", РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Да Тогда
Объект.ВыполненныеРаботы.Очистить();
Иначе
Возврат;
КонецЕсли;
Иначе
ТекстСообщения = "Нельзя выполнить данную команду, поскольку заявка уже выполнена!";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
ТекстСообщения,
,
"Статус",
"Объект"
);
Возврат;
КонецЕсли;
КонецЕсли;
КонецПроцедуры |
|
С целью исключения возможности изменения даты документа пользователем в модуль формы, в процедуру "ПриСозданииНаСервере", добавлен следующий программный код:
| 1C | 1
| Элементы.Дата.ТолькоПросмотр = Истина; |
|
2. Команда формы "Очистить".
Размещение в том же документе.
Реализован алгоритм вывода диалогового окна в случае, если табличная часть документа заполнена, а также вывод уведомления при вызове команды, если табличная часть пуста.
Первый вариант, с выносом алгоритма диалогового окна в отдельную процедуру:
| 1C | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| &НаКлиенте
Процедура Очистить(Команда)
ТЧ = Объект.ВыполненныеРаботы;
Если ТЧ.Количество() > 0 Тогда
Если Объект.Статус <> ПредопределенноеЗначение("Перечисление.сгэСтатусРемонтаТС.Выполнено") Тогда
ПоказатьВопрос(
Новый ОписаниеОповещения("Очистить_Ответ", ЭтаФорма),
"Таблица будет очищена. Продолжить?",
РежимДиалогаВопрос.ДаНет
);
Возврат;
Иначе
ОчиститьСообщения();
ТекстСообщения = "Нельзя выполнить данную команду, поскольку заявка уже выполнена!";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
ТекстСообщения,
,
"Статус",
"Объект"
);
Возврат;
КонецЕсли;
ИначеЕсли ТЧ.Количество() = 0 Тогда
ОчиститьСообщения();
Сообщить("Нет данных для очистки!");
Возврат;
Модифицированность = Ложь;
КонецЕсли;
Очистить_Ответ(КодВозвратаДиалога.Да,);
КонецПроцедуры
&НаКлиенте
Процедура Очистить_Ответ(Результат, ДопПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
Объект.ВыполненныеРаботы.Очистить();
Модифицированность = Истина;
КонецПроцедуры |
|
Второй вариант реализации, с алгоритмом диалогового окна внутри команды формы:
| 1C | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| &НаКлиенте
Процедура Очистить(Команда)
ТЧ = Объект.ВыполненныеРаботы;
Если ТЧ.Количество() > 0 Тогда
Если Объект.Статус <> ПредопределенноеЗначение("Перечисление.сгэСтатусРемонтаТС.Выполнено") Тогда
Ответ = Вопрос("Таблица будет очищена. Продолжить?", РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Да Тогда
Объект.ВыполненныеРаботы.Очистить();
Модифицированность =Истина;
Иначе
Возврат;
КонецЕсли;
Иначе
ОчиститьСообщения();
ТекстСообщения = "Нельзя выполнить данную команду, поскольку заявка уже выполнена!";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
ТекстСообщения,
,
"Статус",
"Объект"
);
Возврат;
КонецЕсли;
ИначеЕсли ТЧ.Количество() = 0 Тогда
ОчиститьСообщения();
Сообщить("Нет данных для очистки!");
Возврат;
Модифицированность = Ложь;
КонецЕсли;
КонецПроцедуры |
|
|