Имя: Пароль:
1C
1C 7.7
v7: Установка периодического реквизита
0 Масянька
 
07.11.11
15:47
День добрый!
Хочу сделать документ "Установка цен номенклатуры" (ТиС, 932).

Функция ПроверкаСправочникаЦен()

   СпрЦены = СоздатьОбъект("Справочник.Цены");
   
   СпрЦены.ИспользоватьВладельца(Номенклатура);
   СпрЦены.ВыбратьЭлементы();
   
   Пока СпрЦены.ПолучитьЭлемент() = 1 Цикл
       Если СпрЦены.ТипЦен <> ТипЦен Тогда
           Продолжить;
       КонецЕсли;
       
       Если Выбран() = 0 Тогда
           Возврат 0;
       Иначе
           Если (Цена <> СпрЦены.Цена) И (Валюта <> СпрЦены.Валюта) И (Единица <> СпрЦены.Единица) Тогда
               Возврат 0;
           КонецЕсли;
       КонецЕсли;
       
   КонецЦикла;
   
   Возврат 1;        // цены уже есть в справочнике
   
КонецФункции    // ПроверкаСправочника

Процедура ЗаписатьЦены()

   СпрЦены        = СоздатьОбъект("Справочник.Цены");
   СпрНоменклатура    = СоздатьОбъект("Справочник.Номенклатура");
   
   
   СпрНоменклатура.НайтиПоКоду(Номенклатура.Код);
   мНоменклатура = СпрНоменклатура.ТекущийЭлемент();
   
   СпрЦены.Новый();
   СпрЦены.Владелец = мНоменклатура;
   СпрЦены.Валюта     = Валюта;
   СпрЦены.ТипЦен     = ТипЦен;
   СпрЦены.Записать();
   
   УстановитьРеквизитСправочника(СпрЦены.ТекущийЭлемент(), "Единица", Единица, ДатаДок);
   УстановитьРеквизитСправочника(СпрЦены.ТекущийЭлемент(), "Цена",    Цена,    ДатаДок);
   СпрЦены.Записать();

КонецПроцедуры    // ЗаписатьЦены

//************* обработка проведения ********************************************
Процедура ОбработкаПроведения()
   
   ВыбратьСтроки();
   
   Пока ПолучитьСтроку() = 1 Цикл
       ЕстьТакаяЦена = ПроверкаСправочникаЦен();
       Если ЕстьТакаяЦена = 1 Тогда        // новая цена
           ЗаписатьЦены();
       КонецЕсли;
   КонецЦикла;
   
КонецПроцедуры    // ОбработкаПроведения


Первый раз - проводится, в справочник садятся цены. Во второй раз - проводится, но в справочнике слетает дата.
Где косяк-то?
Спасибо.

PS Ногами не бить!!!!
1 Wobland
 
07.11.11
15:49
(0) простите нас, добрая Масянька
2 1Сергей
 
07.11.11
15:52
не правильная проверка
3 Конфигуратор1с
 
07.11.11
15:55
СпрНоменклатура.НайтиПоКоду(Номенклатура.Код); замените на НайтиЭлемент
4 andrewks
 
07.11.11
15:55
на, дарю:

////////////////////////////////////////////////////////////////////////////////
// ПРЕДОПРЕДЕЛЕННЫЕ ПРОЦЕДУРЫ
//
//******************************************************************************
// Предопределенная процедура.
//
Процедура ОбработкаПроведения(ВидыДвижений)
   Перем ЦенаЦены,ЕдЦены,ВалЦены,СпрЦена,ЭлЦены;
   
   
   // Проверка заполненности обязательных реквизитов.
     Если глВсеРеквизитыДокументаЗаполнены(Контекст,"Валюта,ТипЦен")=0 Тогда
       Возврат;
   КонецЕсли;                
   
   Если Склад.Выбран()=1 Тогда
       Если Склад.РозничныйСклад=1 Тогда
           глНеПроводить(Контекст,"Выбранный склад не является оптовым!
           |Переоценка на таком складе производится документом 'Переоценка (розница)'!");
           Возврат;
       КонецЕсли;
   КонецЕсли;
   
   ВыбратьСтроки();
   Пока ПолучитьСтроку()=1 Цикл
       Если Единица.Выбран()=0 Тогда
           глНеПроводить(Контекст,"В строке "+СокрЛП(НомерСтроки)+" не выбрана единица!");
           Возврат;
       КонецЕсли;
       //Если ЦенаНовая=0 Тогда
       //    глНеПроводить(Контекст,"В строке "+СокрЛП(НомерСтроки)+" не выбрана новая цена!");
       //    Возврат;
       //КонецЕсли;
       Если ЦенаНовая=0 Тогда
           глСообщениеПроведения("В строке "+СокрЛП(НомерСтроки)+" не выбрана новая цена!", ТекущийДокумент(),,,1);
       КонецЕсли;
   КонецЦикла;
   
   // Удаление движений по регистрам.
   Для Номер = 1 По Метаданные.Справочник() Цикл
       ОчиститьДвижения("Справочник."+Метаданные.Справочник(Номер).Идентификатор);
   КонецЦикла;
   
   ВыбратьСтроки();
   Пока ПолучитьСтроку()=1 Цикл
       Если глВернутьЦену(Номенклатура,ТипЦен,ДатаДок,ЦенаЦены,ЕдЦены,ВалЦены,,ЭлЦены)=1 Тогда
           Цена2=глПересчет(ЦенаНовая,Валюта,Курс,ВалЦены,ДатаДок,Кратность);
           УстановитьРеквизитСправочника(ЭлЦены,"Цена",Цена2,ДатаДок);
           УстановитьРеквизитСправочника(ЭлЦены,"Единица",Единица,ДатаДок);
       Иначе
           СпрЦена=СоздатьОбъект("Справочник.Цены");
           СпрЦена.Новый();
           СпрЦена.Владелец=Номенклатура;
           СпрЦена.ИспользоватьДату(Дата("01.01.1980"),1);
           СпрЦена.ТипЦен=ТипЦен;
           СпрЦена.Валюта=Валюта;
           СпрЦена.Записать();
           УстановитьРеквизитСправочника(СпрЦена.ТекущийЭлемент(),"Цена",ЦенаНовая,ДатаДок);
           УстановитьРеквизитСправочника(СпрЦена.ТекущийЭлемент(),"Единица",Единица,ДатаДок);
       КонецЕсли;
       
   КонецЦикла;
   
   глПриПроведении(Контекст, ВидыДвижений);
   
КонецПроцедуры //ОбработкаПроведения()

////////////////////////////////////////////////////////////////////////////////
// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ
5 Масянька
 
07.11.11
15:57
Спасибо, добрые дядьки!
Пошла пробовать.
6 1Сергей
 
07.11.11
16:10
Может быть несколько цен с разными валютами или единицами?
7 Масянька
 
07.11.11
16:35
(6) Валюта, единица - нет (одинаковы).
8 1Сергей
 
07.11.11
16:46
(7) не понял твоего ответа
9 Масянька
 
07.11.11
16:57
Валюта - одна, единица - тоже, как правило, одна.
10 Cthulhu
 
07.11.11
17:45
что такое "слетает дата"?
вообще - всё не так.
(у документа галка "автоматическая очистка движений" стоит?)
Закон Брукера: Даже маленькая практика стоит большой теории.