Перенос обработчика из 2.5 в 3.1

1. ranis888 104 21.02.18 12:26 Сейчас в теме
Док            = Документы.НачислениеЗарплаты; 
	Сотр           = Справочник.Сотрудники; 
	СпрВидРасчета  = ПланыВидовРасчета.Начисления; 
  Док=Документы.НачислениеЗарплатыРаботникамОрганизаций.СоздатьДокумент();
я


{ВнешняяОбработка.ЗагрузкаНарядов_3.Форма.ЗагрузкаНарядов.Форма(15,19)}: Переменная не определена (Документы)
Док = <<?>>Документы.НачислениеЗарплаты; (Проверка: Тонкий клиент)
{ВнешняяОбработка.ЗагрузкаНарядов_3.Форма.ЗагрузкаНарядов.Форма(18,7)}: Переменная не определена (Документы)
Док=<<?>>Документы.НачислениеЗарплатыРаботникамОрганизаций.СоздатьДокумент(); (Проверка: Тонкий клиент)
{ВнешняяОбработка.ЗагрузкаНарядов_3.Форма.ЗагрузкаНарядов.Форма(16,19)}: Переменная не определена (Справочник)
Сотр = <<?>>Справочник.Сотрудники; (Проверка: Тонкий клиент)



Ругается, как правильно записать ?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. TODD22 18 21.02.18 12:36 Сейчас в теме
(1)
Ругается, как правильно записать ?

Разобраться в клиент-серверной технологии и управляемых формах или позвать программиста.
3. ranis888 104 21.02.18 12:39 Сейчас в теме
(2) Если вы не можете помочь, то зачем писать ??????????????????????????
4. TODD22 18 21.02.18 12:41 Сейчас в теме
(3)
Разобраться в клиент-серверной технологии

Вот это нужно...
Если вы не можете помочь, то зачем писать ??????????????????????????

Вам нужна помощь или что бы за вас сделали?
5. TODD22 18 21.02.18 12:45 Сейчас в теме
6. ranis888 104 21.02.18 12:46 Сейчас в теме
(5)
Код
 &НаКлиенте
Процедура Команда2(Команда)
Перем ТипРасчета;

   ДБФ = Новый XBase;  
    ДБФ.Кодировка = КодировкаXBase.OEM;
ДБФ.ОткрытьФайл("\\Server\ZAR_PLAT\ZARVAL\Sd_Nar.DBF");
   Если ДБФ. Открыта() = 0 Тогда
      //Предупреждение("Не смогли открыть Базу!", 2);
      Возврат;
   КонецЕсли;        
   ДБФ.Индексы.Добавить("Shifr",0,0,"");
   ДБФ.СоздатьИндексныйФайл("i_Sd_Nar.cdx");   
   Док            = Документы.НачислениеЗарплаты; 
   Сотр           = Справочники.Сотрудники; 
   СпрВидРасчета  = ПланыВидовРасчета.Начисления; 
  НовыйДок = Док.СоздатьДокумент(); 
Показать полностью

Получается на сервере надо запускать?
7. TODD22 18 21.02.18 12:48 Сейчас в теме
(6)В управляемых формах на которых работает ЗУП 3 объекты доступны только на сервере.
Если нужно работать с документами, справочниками и тд это нужно делать на стороне сервера. То есть с директивой компиляции &НаСервере.
На клиенте объекты не доступны.
8. ranis888 104 21.02.18 12:49 Сейчас в теме
(7) Но суть в том, что так документ не создается
9. TODD22 18 21.02.18 12:53 Сейчас в теме
(8)
что так

"так" это как?

&НаСервере
Процедура СоздатьНачислениеЗаработнойПлаты()
НачислениеЗП = Документы.НачислениеЗаработнойПлаты.СоздатьДокумент();
//заполняем реквизиты
НачислениеЗП.Записать();
КонецПроцедуры
10. ranis888 104 21.02.18 12:55 Сейчас в теме
11. ranis888 104 21.02.18 12:56 Сейчас в теме
(9)
НачислениеЗП =

Код
&НаСервере
Процедура Команда2(Команда)
Перем ТипРасчета;

   ДБФ = Новый XBase;  
    ДБФ.Кодировка = КодировкаXBase.OEM;
ДБФ.ОткрытьФайл("\\Server\ZAR_PLAT\ZARVAL\Sd_Nar.DBF");
   Если ДБФ. Открыта() = 0 Тогда
      //Предупреждение("Не смогли открыть Базу!", 2);
      
      Возврат;
   КонецЕсли;        
   ДБФ.Индексы.Добавить("Shifr",0,0,"");
   ДБФ.СоздатьИндексныйФайл("i_Sd_Nar.cdx");   
   Док            = Документы.НачислениеЗарплаты; 
   Сотр           = Справочники.Сотрудники; 
   СпрВидРасчета  = ПланыВидовРасчета.Начисления; 
  НовыйДок = Док.СоздатьДокумент(); 
Показать полностью
12. mvandrew 21.02.18 12:58 Сейчас в теме
(8) Если нужно на клиентской стороне подготовить данные, а потом создать документ, стоит разделить процесс. Например, на клиенте готовите структуру с данными, а потом забрасываете ее на сервер.

Концептуально может выглядеть так:

&НаСервере
Процедура СозданиеДокументаНачисления(ДанныеДокумента)

	Док = Документы.НачислениеЗарплаты.СоздатьДокумент();
	ЗаполнитьЗначенияСвойств(Док, ДанныеДокумента);
	Док.Записать();

КонецПроцедуры
 
&НаКлиенте
Процедура ИмпортДанныхДляНачисления()

	ДанныеДокумента = Новый Структура;
	
	ДанныеДокумента.Вставить("Комментарий", "Импорт документа");
	// Заполнение структуры другими реквизитами по Вашим правилам
	
	// Создание документа
	СозданиеДокументаНачисления(ДанныеДокумента);

КонецПроцедуры
Показать


Это довольно простой пример, но отражает суть работы на управляемых формах. Просто адаптируйте под свою задачу.
13. ranis888 104 21.02.18 13:05 Сейчас в теме
(12) Получается на клиенте получаем данные из базы данных, и НаСервере записываем эти данные?
16. mvandrew 21.02.18 13:19 Сейчас в теме
(13) Можно так, а можно всё на сервере сделать. Если Вы работаете в файловой базе с XBase, то не принципиально где данные получать. Разница будет, если у Вас клиент-сервер, тогда сервер работает в отдельном потоке на сервере под своим пользователем, соответственно файл Dbf с клиентской машины напрямую ему будет недоступен. Тогда в серверную процедуру файл нужно передавать через временное хранилище или он должен находится на файловом ресурсе, который доступен пользователю, под которым работает серверный поток.

В Вашем случае, чтоб не заморачиваться, я бы прочитал файл на клиенте, заполнил структуру, а потом отправил бы всё это на сервер, и там бы работал уже со структурой. Собственно, под такой вариант я Вам и прислал пример.

Но чисто методически правильнее было бы передавать DBF файл на сервер через временное хранилище и целиком его обрабатывать на стороне сервера.
14. ranis888 104 21.02.18 13:07 Сейчас в теме
(12)
Код
 
&НаКлиенте
Процедура ИмпортДанныхДляНачисления()
    ДанныеДокумента = Новый Структура;
    
    ДанныеДокумента.Вставить("Комментарий", "Импорт документа");
   
   ДБФ = Новый XBase;  
    ДБФ.Кодировка = КодировкаXBase.OEM;
ДБФ.ОткрытьФайл("\\Server\ZAR_PLAT\ZARVAL\Sd_Nar.DBF");
   Если ДБФ. Открыта() = 0 Тогда
      //Предупреждение("Не смогли открыть Базу!", 2);
      
      Возврат;
   КонецЕсли;        
   ДБФ.Индексы.Добавить("Shifr",0,0,"");
   ДБФ.СоздатьИндексныйФайл("i_Sd_Nar.cdx");
   
   СозданиеДокументаНачисления(ДанныеДокумента);
   
   КонецПроцедуры;

Показать полностью


Верно?
17. mvandrew 21.02.18 13:23 Сейчас в теме
(14) Файл то Вы открыли, но данные то нужно из него выбрать и затолкнуть в структуру, а потом для каждой итерации вызвать создание документа на сервере. Т.е. извлекли данные для первого документа из Dbf, заполнили структуру, вызвали создание на сервере. Потом то же самое для следующего документа, и т.д.

Так же можно сразу сделать массив структур с данными документов и отправить его на сервер целиком, а он его обработает и создаст документы. Тогда процедуру создания нужно доработать исходя из того, то Вы в нее не данные одного документа отправляете, а массив документов.
18. ranis888 104 21.02.18 13:33 Сейчас в теме
(17)
(16)
Можно так, а можно всё на сервере сделать.



&НаСервере
Процедура Команда2(Команда)
Перем ТипРасчета;
	ДБФ = Новый XBase;  
    ДБФ.Кодировка = КодировкаXBase.OEM;
ДБФ.ОткрытьФайл("\\Server\ZAR_PLAT\ZARVAL\Sd_Nar.DBF");
	Если ДБФ. Открыта() = 0 Тогда
		//Предупреждение("Не смогли открыть Базу!", 2)
		Возврат;
	КонецЕсли;        
	ДБФ.Индексы.Добавить("Shifr",0,0,"");
	ДБФ.СоздатьИндексныйФайл("i_Sd_Nar.cdx");	
	Док            = Документы.НачислениеЗарплаты; 
	Сотр           = Справочники.Сотрудники; 
	СпрВидРасчета  = ПланыВидовРасчета.Начисления; 
    Док = Документы.НачислениеЗаработнойПлаты.СоздатьДокумент();
	ДБФ.Первая(); 
			Пока ДБФ.ВКонце() = 0 Цикл
 				ВидОплаты = ДБФ.Shifr;
				Док.ПериодНачисленияДатаОкончания = ДБФ.Dat_End;
				Если ДБФ.Shifr = "001" Тогда
    			    Шифр001 = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоНаименованию("Сдельные наряды(суммой)",0);
    			    Если Не Шифр001.Пустая() Тогда
	    			    Расчет1 = Шифр001;  
					Иначе
						//Предупреждение ("Шифр оплаты Сдельные наряды(суммой) не найден",3);
		    		КонецЕсли;  
				ИначеЕсли ДБФ.Shifr = "005" Тогда
    			    Шифр005 = СпрВидРасчета.НайтиПоНаименованию("Сверхурочные(суммой)", 0);   
    			    Если Не Шифр005.Пустая() Тогда
	    			    Расчет1 = Шифр005;  
					Иначе
    					//Предупреждение ("Шифр оплаты Сверхурочные(суммой) не найден",3);
		    		КонецЕсли;  
				ИначеЕсли ДБФ.Shifr = "050" Тогда
    			    Шифр050 = СпрВидРасчета.НайтиПоНаименованию("Премия месячная(суммой)", 0);
    			    Если Не Шифр050.Пустая() Тогда
	    			    Расчет1 = Шифр050;  
					Иначе
    					//Предупреждение ("Шифр оплаты Премия месячная(суммой)не найден",3);
					КонецЕсли; 
				ИначеЕсли ДБФ.Shifr = "002" Тогда
    			    Шифр002 = СпрВидРасчета.НайтиПоНаименованию("Повременная оплата(суммой)", 0);
    			    Если Не Шифр002.Пустая() Тогда
	    			    Расчет1 = Шифр002;  
					Иначе
    					//Предупреждение ("Повременная оплата(суммой) не найден",3);
		    		КонецЕсли;  
				ИначеЕсли ДБФ.Shifr = "018" Тогда
    			    Шифр018 = СпрВидРасчета.НайтиПоНаименованию("Оплата разных работ", 0);
    			    Если Не Шифр018.Пустая() Тогда
	    			    Расчет1 = Шифр018;  
					Иначе
    					//Предупреждение ("Шифр оплаты Оплата разных работ не найден",3);
					КонецЕсли; 
				Иначе
					//Предупреждение ("Шифр оплаты "+ ДБФ.Shifr+" не найден",50);
				КонецЕсли; 
				
    	        ОписательЗначения = "";
	            ОписательВеличины = ""; 

				КолСтрок = 0;
                Пока (ДБФ.ВКонце() = 0) и (ВидОплаты = ДБФ.Shifr) Цикл
    			    ТекСтрока = Док.Начисления.Добавить(); 
					КолСтрок = КолСтрок + 1;
    			    ТекСтрока.ВидРасчета = Расчет1;
			    	Сотр1 = Сотр.НайтиПоКоду(ДБФ.TabNom, 0);
					//
					
			    	Если Не Сотр1.Пустая() Тогда
				        ТекСтрока.Сотрудник = Сотр1;
	
				    Иначе  
					  
					КонецЕсли;

				    ТекСтрока.Результат   = ДБФ.Summa; 
	 
		         ТекСтрока.ДатаНачала = ТекущаяДата();
                    ТекСтрока.ДатаНачалаСобытия = ДБФ.Dat_Beg;
                    ТекСтрока.ДатаОкончания = ДБФ.Dat_End;
		 
		 
                    ДБФ.Следующая();   
                    Если (ДБФ.ВКонце() = 1)  Тогда
						Прервать;
					КонецЕсли;
				КонецЦикла;
				Если КолСтрок > 0 Тогда
                     Док.Дата = ТекущаяДата();	
					  КонецЕсли;
			КонецЦикла;
			 
			 Док.Записать();
		Сообщить(ОписаниеОшибки()); 

КонецПроцедуры
Показать
19. mvandrew 21.02.18 13:40 Сейчас в теме
(18) В принципе что-то вроде... Попробуйте.

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

ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
20. ranis888 104 21.02.18 13:50 Сейчас в теме
(19) Да, они поэтому в комментариях. Но суть в том что этот код не работает
21. ranis888 104 21.02.18 13:52 Сейчас в теме
(19)
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);



&НаСервере
Процедура Команда2(Команда)
Перем ТипРасчета;
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("SsssS");

	ДБФ = Новый XBase;  
    ДБФ.Кодировка = КодировкаXBase.OEM;

ничего не выходит
22. independ 1520 21.02.18 13:53 Сейчас в теме
(21) Сообщить() работает на сервере
23. ranis888 104 21.02.18 13:58 Сейчас в теме
(22) Попробовал всё убрать и написал Сообщить("SSSSSSSSS"); И толку 0 нет сообщения
24. independ 1520 21.02.18 14:02 Сейчас в теме
(23) Работает, может процедура Команда2(Команда) не запускается?
25. ranis888 104 21.02.18 14:03 Сейчас в теме
(24) Да, это исправил. Но документ всё равно не создается
27. mvandrew 21.02.18 14:57 Сейчас в теме
(25) Смотрите ошибки, журнал регистрации и права доступа на создание документа. Явно у вас где-то грабли.
28. ranis888 104 21.02.18 15:22 Сейчас в теме
(27) В коде исправил всё. А еще вопрос как сделать так чтобы, записывались данные ДБФ.Shifr = 050?
15. ranis888 104 21.02.18 13:16 Сейчас в теме
{ВнешняяОбработка.ЗагрузкаНарядов_3.Форма.ЗагрузкаНарядов.Форма(134,1)}: Неопознанный оператор
<<?>>&НаСервере (Проверка: Сервер)
{ВнешняяОбработка.ЗагрузкаНарядов_3.Форма.ЗагрузкаНарядов.Форма(1,1)}: Обнаружено логическое завершение исходного текста модуля (Проверка: Сервер)
{ВнешняяОбработка.ЗагрузкаНарядов_3.Форма.ЗагрузкаНарядов.Форма(134,1)}: Неопознанный оператор
<<?>>&НаСервере (Проверка: Тонкий клиент)
{ВнешняяОбработка.ЗагрузкаНарядов_3.Форма.ЗагрузкаНарядов.Форма(1,1)}: Обнаружено логическое завершение исходного текста модуля (Проверка: Тонкий клиент)
26. ranis888 104 21.02.18 14:22 Сейчас в теме
Всё заработало. Спасибо
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот