Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 20:37

Не считает графу сумма в докуменах

Автор Сергей1983, 11 ноя 2011, 10:24

0 Пользователей и 1 гость просматривают эту тему.

Сергей1983

Помогите решить проблему! ТиС 7.7. После объединения одной конфигурации с другой не считает поле сумма в докуменах, кол-во и цена есть, а сумма не считается. С той что объединял там все считает.

1Cnastroika

1. Сначала нужно убедиться, что обе конфигурации стали одинаковые. Для этого нужно начать объединение и проверить, будут ли выданы различающиеся объекты в двух конфигурациях. Объединение имеет разные режимы. Если не был задан режим: замещать объекты, и приоритет конфигурации: загружаемая конфигурация, то конфигурации после объединения могут отличаться.

2. Может быть после объединения в конфигурации используются не такие данные, как в исходной, поэтому не считает.

3. Можно найти процедуру вычисления суммы и проверить.

Сергей1983

При объединении конфигураций использовал приоритет загружаемая конфигурация и замещать объекты. После такого обе конфигурации должны наверно быть одинаковыми. Да и процедуры вычисления суммы идентичные.

1Cnastroika

Цитата: Сергей1983 от 11 ноя 2011, 10:54
При объединении конфигураций использовал приоритет загружаемая конфигурация и замещать объекты. После такого обе конфигурации должны наверно быть одинаковыми. Да и процедуры вычисления суммы идентичные.

Проверить лишний раз одинаковые ли конфигурации никогда не повредит. Ошибки могут быть там, где их не ждешь. Если конфигурации одинаковые, то проблема с вводом данных. Приведите процедуру вычисления суммы из новой конфигурации.

1Cnastroika

Сумму не считает при вводе новых данных и нажатии Enter на количестве и цене, или Вы ждете что будут автоматически пересчитаны уже набранные данные?

Сергей1983

Цитата: 1Cnastroika от 11 ноя 2011, 15:29
Сумму не считает при вводе новых данных и нажатии Enter на количестве и цене, или Вы ждете что будут автоматически пересчитаны уже набранные данные?
Как обычно у нас бывает: Открываю документ например "Реализация розница", по кнопке "подбор" открывается справочник "для подбора"набираю нужную номенклатуру, нажимаю ОК, она переноситься в документ а там сумма не считаеться.

1Cnastroika

В форме документа в табличной части сделайте двойной щелчок по колонке с товаром или количеством или ценой. Откроется форма свойств колонки. На закладке "дополнительно" в поле "формула" будет имя процедуры, выполняемой при нажатии enter на этой колонке в режиме работы с данными. Перейдите на закладку "Модуль" и найдите эту процедуру. Скопируйте процедуру на форум. Процедура может вызывать другие процедуры. Они тоже могут понадобиться для анализа.

Сергей1983

Цитата: 1Cnastroika от 11 ноя 2011, 18:28
В форме документа в табличной части сделайте двойной щелчок по колонке с товаром или количеством или ценой. Откроется форма свойств колонки. На закладке "дополнительно" в поле "формула" будет имя процедуры, выполняемой при нажатии enter на этой колонке в режиме работы с данными. Перейдите на закладку "Модуль" и найдите эту процедуру. Скопируйте процедуру на форум. Процедура может вызывать другие процедуры. Они тоже могут понадобиться для анализа.

В колонке "Номенклатура":
Процедура ПриИзмененииНоменклатуры()
   глПересчетТаблЧасти(Контекст,Форма.ТекущаяКолонка(), СписокПараметров);
   ШтрихКод = Единица.ШтрихКод;   

   // для услуги цены можно редактировать, иначе нужно выбирать из остатков регистра
   Если (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Услуга) ИЛИ (Склад.РозничныйСклад = 0) Тогда
      Форма.Цена.Редактирование(1);
   Иначе
      Форма.Цена.Редактирование(0);
   КонецЕсли;
КонецПроцедуры

*******************************************************************************************
из глобального модуля
Процедура глПересчетТаблЧасти(Конт,ИмяРеквизита, ПараметрыРозничнойЦены = 0) Экспорт 
   
   Перем ВремКоэфф, ВремЦена, НоваяНоменклатура;
   Перем ЕстьСкидка;    // 1 - в документе есть скидка, 0 - скидки нет
   Перем ПроцентСкидки;
   Перем ТЦены;
   Перем ЕстьНДС, ЕстьНП;
   Перем ЦенаЦены, ЕдЦены, ВалютаЦены;
   Перем ТовЦена, ЕдиницаЦены, ВалЦены, НаценкаЦены, НайденнаяЦена;
                                                  
   ДатаДок   = Конт.ДатаДок;
   
   ЕстьТипЦен   = глЕстьРеквизитШапки("ТипЦен",Конт.Вид());
   ЕстьСкидка   = глЕстьРеквизитШапки("Скидка",Конт.Вид());
   ЕстьНДС      = глЕстьРеквизитМнЧ("СуммаНДС",Конт.Вид());
   ЕстьНП      = глЕстьРеквизитМнЧ("СуммаНП", Конт.Вид());
   ЕстьСум      = глЕстьРеквизитМнЧ("Сумма1", Конт.Вид());
      
   Если ЕстьСкидка=1 Тогда
      Если (Конт.Скидка <>Константа.СкидкаРозЗак) и (Конт.Скидка <>Константа.НаценкаЗак) Тогда
         ПроцентСкидки=Конт.Скидка.Процент;
      Иначе                                 
         глПересчитатьСкидки2(Конт);
      КонецЕсли;
   Иначе                                 
      ПроцентСкидки=0;
   КонецЕсли;
      
   Если ИмяРеквизита = "Номенклатура" Тогда
      Номенклатура=Конт.Номенклатура;
      Если ПустоеЗначение(Номенклатура) = 1 Тогда
         
         // Очистили Номенклатуру
         Конт.Единица       = 0;
         Если глЕстьРеквизитМнЧ("Партия",Конт.Вид())=1 Тогда
            Конт.Партия      = 0;
         КонецЕсли;
         Конт.Коэффициент    = 0;                 
         Конт.Цена         = 0;
         Конт.Количество    = 0;
         Конт.Сумма          = 0;     
         Если ЕстьНДС = 1 Тогда
            Конт.СуммаНДС   = 0;
         КонецЕсли;
         Если ЕстьНП = 1 Тогда
            Конт.СуммаНП   = 0;
         КонецЕсли;
         Если ЕстьСум = 1 Тогда
            Конт.Сумма1   = 0;
         КонецЕсли;
         Возврат;
      КонецЕсли;

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


Сергей1983

обе эти процедуры одинаковые в обеих конфигурациях. В одной сумма считается ,в другой нет.

1Cnastroika

Иногда бывают сбои в данных, которые устраняются при тестировании и исправлении ИБ. Иногда настраивают автоматическое тестирование и исправление ИБ на сервере, иногда нужно запускать тестирование и исправление ИБ из конфигуратора. Сейчас посмотрю текст процедуры.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск