Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Обработка для автоматического создания подчиненных документов.  (Прочитано 13059 раз)
0 Пользователей и 1 Гость смотрят эту тему.
cerber-one
Гость
« : 23-09-2008 09:43 » 

   Для того, что бы вникнуть суть задачи объясню всю ситуацию.

   Работаю в торговой компании в 1С 7.7. Ежедневно набивается около 500-600 заказов (счет-фактур). Работа муторная, особенно если учесть, что основной объем работы начинается где-то в 16-00. Как показал опыт проще и быстрее если сначала сохранить все счет-фактуры, а уж затем создавать к ним приходные ордера.
   
   Сама проблема: пытаюсь создать обработку для автоматического создания ПО для выбранных С-Ф.
Написал следующий код, но создается ПО на последнюю из выбранных С-Ф и обработка заканчивается:

Цитата
Перем Конт;
//*******************************************
Процедура Сформировать()         
   Док = СоздатьОбъект("Документ.СчетФактура");
   ДокПО = СоздатьОбъект("Документ");
   Доки.ВыбратьСтроки();

      
   Пока Доки.ПолучитьСтроку() = 1 Цикл
      Если Доки.Пиктограмма = 1 Тогда
         Продолжить;
      КонецЕсли;

      Док.НайтиДокумент(Доки.ТекДок);   
      Док.ВыбратьСтроки();
      ИтогоБезНДС = 0;
      ИтогоНДС = 0;
      ИтогоНРТ = 0;
      

      ИтогоБезНДС = Док.СуммаБезНДС;
      ИтогоНДС =  Док.СуммаНДС;
      
      ИтогоНРТ = ИтогоБезНДС*Док.СтавкаНРТ/100;
      Итого = ИтогоБезНДС + ИтогоНДС + ИтогоНРТ;
      
      ОткрытьФорму("Документ.ПриходныйОрдер",Конт);
      
      Конт.Филиал = Филиал;
       Конт.НомерПервДок = СокрЛП(Док.НомерДок);
      Конт.ДатаПервДок = Док.ДатаДок;
      Конт.ДатаДок = Док.ДатаДок;
      Если Док.ВалютаДок = Константа.НацВалюта
      Тогда
         Конт.Касса = Филиал.ОснКасса;
      Иначе
         Конт.Касса = Филиал.ОснВалКасса;
      КонецЕсли;
      ОперПО = Константа.ОперацияОплатаОтПолучателя;
      Сч = ОперПО.СчетК;
      Конт.Опер = ОперПО;
      Конт.Субконто1 = Док.Получатель;
      Конт.Субконто2 = "";
      Конт.Валюта = ВалютаПечати;
      Конт.Сумма = Итого;
      Конт.СуммаНДС = ИтогоНДС;
      Конт.ВалютаУчета = ВалютаПечати;
      Конт.КурсУчета = Док.КурсДок;
      Конт.СуммаУчета = Итого;
      Конт.Основание = "Счет-фактура № "+СокрЛП(Док.НомерДок)+" от "+Док.ДатаДок;
      Конт.Приложение = "";
      Конт.ДокументВладелец = Док.ТекущийДокумент();
      Конт.Автор = Док.Автор;
       Конт.Экспедитор = Док.Экспедитор;
   
      Конт.Форма.Субконто1.Видимость(?(ПустаяСтрока(Конт.Субконто1.Вид())=0,1,0));
      Конт.Форма.Субконто2.Видимость(?(ПустаяСтрока(Конт.Субконто2.Вид())=0,1,0));
      Конт.Форма.СубконтоСтр.Видимость(?(ПустаяСтрока(Конт.Субконто2.Вид())=0,1,0));
      Конт.Форма.КнопкаОчиститьСубконто2.Видимость(?(ПустаяСтрока(Конт.Субконто2.Вид())=0,1,0));
   
      Конт.Форма.Обновить();
      Конт.Форма.Закрыть();//  Справочник

   КонецЦикла;               
КонецПроцедуры

//
//*****************************************************
// 

Процедура ПриОткрытии()
   Доки.НоваяКолонка("Ном",,,,,3);   
   Доки.НоваяКолонка("Дата",,,,,10);   
   Доки.НоваяКолонка("Фактура",,,, "№ Счет -Факуры",12);   
   Доки.НоваяКолонка("Клиент",,,,,24);   
   Доки.НоваяКолонка("Менеджер",,,,,30);   
   Доки.НоваяКолонка("Сумма",,,,,10);
   Доки.НоваяКолонка("Пиктограмма",,,,,3);   
   Доки.НоваяКолонка("Автор",,,,, 10);
   Доки.НоваяКолонка("Цена",,,,,10);
   Доки.НоваяКолонка("ТекДок",,,,, 1);
   Доки.ВыводитьПиктограммы("Пиктограмма", );
   ДатаНачала = РабочаяДата();
   ДатаКонца = РабочаяДата();
КонецПроцедуры   // ПриОткрытии
                           

//
//*****************************************************
// 

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

КонецПроцедуры   // Выбрать
                           
//
//*****************************************************
// 

Процедура УстановитьФлажек()
   
   Если Доки.ПолучитьЗначение(Доки.НомерСтроки, "Пиктограмма") = 1 Тогда
      Доки.УстановитьЗначение(Доки.НомерСтроки, "Пиктограмма", 2);
   Иначе
      Доки.УстановитьЗначение(Доки.НомерСтроки, "Пиктограмма", 1);
   КонецЕсли;
   
КонецПроцедуры   // УстановитьФлажек
Записан
Natalie
люблю программирование
Постоялец

ua
Offline Offline
Пол: Женский

« Ответ #1 : 23-09-2008 10:30 » 

cerber-one,
Может невнимательно посмотрела... но не могли бы Вы сказать, где определена переменная Доки ?
Вы начинаете выборку в третьей строке процедуры Сформировать()... а где она до этого определена? ГлобальнаяЗдесь была моя ладья...
« Последнее редактирование: 23-09-2008 10:32 от Natalie » Записан

...вся жизнь, по сути своей, делает нас сильнее... )))
cerber-one
Гость
« Ответ #2 : 23-09-2008 10:45 » 

Доки -  это таблица в которой отображается список С-Ф.
Сформировать() запускается кнопкой.
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 23-09-2008 15:40 » 

Если хочешь использовать "ввод на основании" в понятии 1С - то для этого в форме документа Приходный ордер нужно написать предопределенную процедуру ВводНаОсновании(<ДокументОснование>)
А открывать форму документа в соответствии с таким синтаксисом:
ОткрытьФорму(<?>,,)
OpenForm(<?>,,)
Синтаксис:
ОткрытьФорму(<ОписательОбъекта>,<КонтекстФормы>,<ДокументОснование>)
Назначение:
Открывает визуальную форму ввода нового документа (в т.ч. в режиме ввода на основании).
Возвращает: 1 - если действие выполнено, 0 - иначе.
<ОписательОбъекта>: "Документ.ПриходныйОрдер"

ну и передать что-то в контексте, чтобы проанализировать и закрыть форму:
Код:
// В модуле обработки
Конт="АвтоПриходныйОрдер";
ОткрытьФорму("Документ.ПриходныйОрдер", Конт, Доки.ТекДок);
...
// В модуле формы документа ПриходныйОрдер
Процедура ВводНаОсновании(Осн)
Если Осн.Вид="СчетФактура" Тогда
Филиал = Осн.Филиал;
НомерПервДок = СокрЛП(Осн.НомерДок);
...
КонецЕсли;
КонецПроцедуры

Процедура ПриОткрытии()
Если Форма.Параметр="АвтоПриходныйОрдер" Тогда
Записать();
СтатусВозврата(0);
Возврат;
КонецЕсли;

// Другие действия при нормальном открытии...
КонецПроцедуры // ПриОткрытии()
Записан
cerber-one
Гость
« Ответ #4 : 24-09-2008 03:23 » 

Kivals, Спасибо за ответ.

Если я хочу сделать внешний отчет без внедрения в основную конфигурацию?
Записан
Harry
Модератор

ua
Offline Offline

« Ответ #5 : 25-09-2008 09:53 » 

Все равно придется писать обработку ввода на основании. Иначе создать подчиненный документ не получится. А вот саму обработку создания документов можно сделать и внешней.
Записан

Слабый пол силен в силу слабости сильного пола к слабому
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 26-09-2008 08:50 » new

cerber-one, можно сделать и так, как ты хочешь. Но если в конфигурации не предусмотрен ввод указанного тобой вида на основании другого - то тогда ты будешь заполнять реквизиты твоим способом, т.е. копировать блок заполнения документа из модуля формы документа в модуль обработки, что есть функционально неправильно: если через месяц конфа поменяется и в документ добавится новый важный реквизит - то 90% что обработку ты поменять забудешь...
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines