Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 1C: Предприятие, SAP, ERP и учётные системы > Можно ли в одной обработке создать 3 таблицы значе


Автор: roalang 2.4.2008, 04:16
У меня есть две базы: за 07 и 08 года. Мне надо получить отчет по материалам который пролежал без движения. Т.е. создать отчет, который показывал материалы без движения по двум этим базам. Они разные. 

Вопрос: можно ли в одной обработке создать 3 ТЗ, 1 для 07 года, 2-ая для 08 года, а в 3-ей сравнить первые две таблицы?????
 
 


Автор: SaschaL 2.4.2008, 05:17
Да такое возможно!
С точки зрения 1С каких либо технических проблем нет!
и тем более сравнить Таблицы Значений между собой, самый простой способ это когда все нужные для этого таблицы значений будут приведены к одной структуре и все!


Автор: Itsys 2.4.2008, 19:33
Проще выбираешь данные из одной базы - хочешь клади их в ТЗ, хочешь проверяй динамически, подключаемся к другой базе по OLE и проверяем там если сходится - выводим куда надо.

Автор: roalang 3.4.2008, 09:18
Itsys  скажи как  по OLE я не разу с этим не работала??? Знаю только ТЗ.

По структуре все таблицы одинаковы..

Автор: SaschaL 3.4.2008, 11:07
ТЗ это таблица значений. А через OLE ты должен подключиться к другой базе данных что бы получить аналогичную информацию из другой базы данных.
Команды для работы с OLE Automation описываются в главе 40 справочника по встроенному языку.
вот пример, взятый с сайта http://www.mista.ru/articles1c/ole.htm, там же еще есть другие примеры, которые показывают работу с OLE Automation:
Цитата

Пример 1. Присоединение к базе 1С через OLE.
БазаОле=СоздатьОбъект("V77.Application"); // Получаем доступ к OLE объекту 1С
Локальная версия (на одного пользователя):  V77L.Application
Сетевая версия:  V77.Application
Версия SQL:  V77S.Application

Далее вместо термина "вызываемая база" будет написано просто "база OLE", а вместо термина "вызывающая база" - "местная база"

Теперь, мы должны знать несколько параметров для запуска базы OLE: Каталог базы, имя пользователя и пароль. Ну, наверное, еще и желание запустить 1С в монопольном режиме smile
КаталогБазыОЛе  = "C:\program files\1cv77\МояБаза\";
ПользовательОле = "Администратор";
ПарольОле       = "qwerty";
МонопольныйРежимOLE = " /m"; // для немонопольного запуска указать пустую строку!
ЗапускБезЗаставки = 1;       // для появления заставки (например, чтобы наблюдать
                             // процесс запуска базы OLE визуально) поставьте здесь "0"
РезультатПодключения = БазаОле.Initialize ( БазаОле.RMTrade , "/d" +
                       СокрЛП(КаталогБазыОле) + " /n" + СокрЛП(ПользовательОле)+
                       " /p" + СокрЛП(ПарольОле) + МонопольныйРежимOLE,
                       ?(ЗапускБезЗаставки = 1,"NO_SPLASH_SHOW",""));
Если РезультатПодключения = 0 Тогда
     Предупреждение("Не удалось подключится к указанной базе - проверьте вводные!");
КонецЕсли;

Комментарий: функции СокрЛП() стоят в примере на случай, если пользователь захочет указанные выше переменные сделать в форме диалога, а проблема при этом состоит в том, что в алгоритм программа передаст полное значение реквизита (т.е. допишет в конце значения то количество пробелов, которое необходимо для получения полной длины строки (указана в свойствах реквизита диалога)). 


Автор: roalang 3.4.2008, 11:35
У меня на данный момент вот такая бредовая идея (сроки поджимают наших снабженцев, аж меня вызвали из декретного).
Процедура Сформировать()
    
Ит = СоздатьОбъект("БухгалтерскиеИтоги");  

    // Первая таблица
    
    Тз.новаяКолонка("Наименование");
    Тз.новаяКолонка("Код");
    Тз.новаяколонка("МестаХранения"); 
    Тз.новаяКолонка("Субсчет10");
    Тз.новаяколонка("Количество");
    Тз.новаяколонка("Снд");
    Тз.новаяколонка("Скд");    
        
    Ит.ИспользоватьСубконто(ВидыСубконто.Материалы,, 1);
    Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,, 1);  
    ВыбСчет="10.01;10.02;10.03;10.04;10.05;10.06;10.08;10.09;10.10.01;10.10.02;10.14";  
    Ит.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода, ВыбСчет,,, 1,,);       
    
    Таб.ВывестиСекцию("Шапка");
    Таб.Опции(0,0,Таб.ВысотаТаблицы(),0);   
    
    Ит.ВыбратьСубконто(ВидыСубконто.Материалы);
    Пока Ит.ПолучитьСубконто(ВидыСубконто.Материалы) = 1 Цикл  
        кол=ИТ.СКД(3); 
        цена=кол*ИТ.СКД(); 
    если Ит.Скд()=0 тогда
        продолжить
    иначе
    если Ит.Снд()=Ит.СКД() тогда
        
    Тз.НоваяСтрока();
    Тз.Наименование=Ит.Субконто(ВидыСубконто.материалы).Наименование;
    Тз.Код=Ит.Субконто(ВидыСубконто.материалы).код;
    Тз.МестаХранения=Ит.Субконто(2);
    Тз.Субсчет10=Ит.Субконто(ВидыСубконто.материалы).Субсчет10;
    Тз.Количество=число(Кол);
    Тз.Снд=Ит.СНД();
    Тз.Скд=Ит.СКД();
     
    конецесли    
    конецесли;                       

    КонецЦикла;
значениевфайл("C:\остатки.txt", Тз);
сообщить("Ура")

КонецПроцедуры   

Процедура сохран()   
    
    Ит = СоздатьОбъект("БухгалтерскиеИтоги"); 
      
// Вторая таблица
    
    Тз1.новаяКолонка("Наименование");
    Тз1.новаяКолонка("Код");
    Тз1.новаяколонка("МестаХранения"); 
    Тз1.новаяКолонка("Субсчет10");
    Тз1.новаяколонка("Количество");
    Тз1.новаяколонка("Снд");
    Тз1.новаяколонка("Скд");
    
        
    Ит.ИспользоватьСубконто(ВидыСубконто.Материалы,, 1);
    Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,, 1);  
    ВыбСчет="10.01;10.02;10.03;10.04;10.05;10.06;10.08;10.09;10.10.01;10.10.02;10.14";  
    Ит.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода, ВыбСчет,,, 1,,);       
    Ит.ВыбратьСубконто(ВидыСубконто.Материалы);
    Пока Ит.ПолучитьСубконто(ВидыСубконто.Материалы) = 1 Цикл  
        кол=ИТ.СКД(3); 
        цена=кол*ИТ.СКД(); 
    если Ит.Скд()=0 тогда
        продолжить
    иначе
    если Ит.Снд()=Ит.СКД() тогда    
    Тз1.НоваяСтрока();
    Тз1.Наименование=Ит.Субконто(ВидыСубконто.материалы).Наименование;
    Тз1.Код=Ит.Субконто(ВидыСубконто.материалы).код;
    Тз1.МестаХранения=Ит.Субконто(2);
    Тз1.Субсчет10=Ит.Субконто(ВидыСубконто.материалы).Субсчет10;
    Тз1.Количество=Кол;
    Тз1.Снд=Ит.СНД();
    Тз1.Скд=Ит.СКД();    
    конецесли    
    конецесли;                       
    КонецЦикла;    
    
КонецПроцедуры       

процедура Выгрузить()                      
    
Перем Тз3;    

тз3=создатьобъект("ТаблицаЗначений");
 
Тз3.новаяКолонка("Наименование");
Тз3.новаяКолонка("Код");
Тз3.новаяколонка("МестаХранения"); 
Тз3.новаяКолонка("Субсчет10");
Тз3.новаяколонка("Количество");
Тз3.новаяколонка("Снд");
Тз3.новаяколонка("Скд");                   
    
ЗначениеИзФайла("C:\остатки.txt",Тз); 

тз3.новаястрока();
Тз3.Наименование=Тз.Наименование;
Тз3.Код=Тз.Код  ;
Тз3.МестаХранения=Тз.МестаХранения;
Тз3.Субсчет10=Тз.Субсчет10;
Тз3.Количество=Тз.Количество;
Тз3.Снд=    Тз.Снд;
Тз3.Скд=Тз.Скд;                      
конецпроцедуры    

Процедура сравнить() 
перем тз1,тз3;    
    
Выгрузить();
сохран();

если тз3.код=тз1.код тогда
сообщить("ура");        
 
конецесли;
    
конецпроцедуры

знаю, что ерунда smile , но подругому мозги не работают smile 

Автор: SaschaL 3.4.2008, 12:25
ТАК это все замечательно, но для того чтобы сравнить однотипную информацию с двух одинаковых баз нужно её получить.
Допустим создали вы отчет или обработку не важно, создали на форме 3 таблицы значений с разными идентификаторами. Но обработку то вы сможете в одной базе, допустим вы написали алгоритм по получению информации из базы, и поместили эту инфу в ТЗ, но для анализа то вам понадобиться и вторую ТЗ заполнить информацией только уже из другой базы, вот как раз для этого вам и нужно использовать OLE а иначе просто ни  чего не получится. 
Тот вариант что у вас описан с использование файла формата txt в принципе тоже приемлемый вариант если создать вначале обработку по получению информации в одной базе и выгрузить её в другой. Но главное в этом случае не запутаться.

Судя по внезапному окончанию кода дальше у вас дело не пошло...

В данной ситуации какого рода совет вам нужен?

Добавлено через 2 минуты и 7 секунд
Если у вас это сделано внешней обработкой можете  скинуть на Sascha@74mail.ru я посмотрю может что и посоветую или помогу доработать если конфигурация конечно у вас стандартная.

Автор: Itsys 3.4.2008, 13:34
Здесь все не так просто, как кажется.

Вопрос зачем тебе такая огромная таблица значений, если при сверке ты используешь только ТЗ.Код - в этом случае проще запихнуть все в СписокЗначений, дальше ты это список сохраняешь ЗначениеВФайл(), в другой конфигурации ты его загружешь из ЗначениеИзФайла, и при проходе итогов проверяешь вхождение нужного кода в список Принадлежит().

Добавлено через 1 минуту и 50 секунд
Цитата(SaschaL @  3.4.2008,  12:25 Найти цитируемый пост)
конфигурация конечно у вас стандартная

Конфигурация нестандартная в стандартной конфе нет таких счетов учета материалов  smile 

ЗЫ Если время ждет, то могу сегодня-завра вечером накидать 2 обработки для первой и второй базы, но сейчас времени нет.

Автор: roalang 3.4.2008, 17:29
SaschaL :
OLE  не использовала.  Обработку послала. Да, но и предприятие у нас не стандартное..... электростанция.

Добавлено через 1 минуту и 8 секунд
время ждет, за один день все равно ниче не сделаю.....

Автор: SaschaL 3.4.2008, 20:07
Обработку получил, завтра с утра на свежую голову взгляну.
И предложу свой вариант

Автор: roalang 4.4.2008, 03:07
OK smile 

Автор: roalang 4.4.2008, 03:51
как сделать заполнение (инициализация) Тз отдельной функцией

Автор: SaschaL 4.4.2008, 09:45
Вы наверное это имели ввиду:
Код

Процедура ЗаполнитьТЗ()
    Спр = СоздатьОбъект("Справочник.Товары");
    спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент()=1 цикл
         ТЗ.НоваяСтрока();
         ТЗ.Код = Спр.Код;
         .............
    КонецЦикла;
КонецПроцедуры


Вот такой примерно принцип заполнения.

Теперь встречный вопрос в обработке которые вы прислали нужно создать третью ТЗ?
 Я так понимаю что в ней должны попасть только те элементы которых не оказалось в одной из таблиц.

Автор: roalang 4.4.2008, 14:48
SaschaL, 
наооборот как я с коллегой поддумав пришла к выводу если значения в Тз1 и  Тз2 равны,   то переносить в 3 Тз

Автор: Itsys 5.4.2008, 09:16
Ну вот, как обещал, собственно ничего сложного
Код для обработки из первой базы:
Код

    Спис = СоздатьОбъект("СписокЗначений");
    БИ = СоздатьОбъект("БухгалтерскиеИтоги");
    БИ.ИспользоватьСубконто(ВидыСубконто.Материалы);
    БИ.ВыполнитьЗапрос(НачДата, КонДата);
    БИ.ВыбратьСубконто(ВидыСубконто.Материалы);
    Пока БИ.ПолучитьСубконто(ВидыСубконто.Материалы) = 1 Цикл
        Если (БИ.ДО(3) = 0) И (БИ.КО(3) = 0) Тогда
            Спис.ДобавитьЗначение(БИ.Субконто(ВидыСубконто.Материалы).Код);
        КонецЕсли;
    КонецЦикла;
    
    ЗначениеВФайл("C:\temp\mat.txt", Спис);


Теперь для второй, в которой и будет формироваться ТЗ со всеми не используемыми материалами:
Код

    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ТЗ.новаяКолонка("Наименование");
    ТЗ.новаяКолонка("Код");
    ТЗ.новаяколонка("МестаХранения"); 
    ТЗ.новаяКолонка("Субсчет10");
    ТЗ.новаяколонка("Количество");
    ТЗ.новаяколонка("Снд");
    ТЗ.новаяколонка("Скд");    
    
    Ит = СоздатьОбъект("БухгалтерскиеИтоги");  
    Ит.ИспользоватьСубконто(ВидыСубконто.Материалы,, 1);
    Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,, 1);  
    //ВыбСчет="10.01;10.02;10.03;10.04;10.05;10.06;10.08;10.09;10.10.01;10.10.02;10.14";//Это не обязательно  
    //Ит.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода, ВыбСчет,,, 1,,);
    //Достаточно так 
    Ит.ВыполнитьЗапрос(НачДата, КонДата);
    
    
    Спис = СоздатьОбъект("СписокЗначений");
    ЗначениеИзФайла("C:\temp\mat.txt", Спис);
    
    //Таб.ВывестиСекцию("Шапка");
    //Таб.Опции(0,0,Таб.ВысотаТаблицы(),0);   
    
    Ит.ВыбратьСубконто(ВидыСубконто.Материалы);
    Пока Ит.ПолучитьСубконто(ВидыСубконто.Материалы) = 1 Цикл
        //А где выборка втрого субконто?
        Ит.ВыбратьСубконто(ВидыСубконто.МестаХранения);
        Пока Ит.ПолучитьСубконто(ВидыСубконто.МестаХранения) = 1 Цикл
        //кол=ИТ.СКД(3); 
        //цена=кол*ИТ.СКД();//А это что за цена такая? количество материала умноженное на его остаточную стоимость (прям цена в квадрате) интересно где Вы дальше собираетесь ее использовать
        //если Ит.Скд()=0 тогда Проверять надо не СКД, а отсутсвие оборотов по дебету и кредиту если Вам нужен материал без движения
            Если (Ит.ДО(3) = 0) И (Ит.КО(3) = 0) Тогда
                Если Спис.Принадлежит(Ит.Субконто(ВидыСубконто.Материалы).Код) = 1 Тогда
                    ТЗ.НоваяСтрока();
                    ТЗ.Наименование = Ит.Субконто(ВидыСубконто.Материалы).Наименование;
                    ТЗ.Код = Ит.Субконто(ВидыСубконто.Материалы).Код;
                    ТЗ.МестаХранения = Ит.Субконто(2);
                    ТЗ.Субсчет10 = Ит.Субконто(ВидыСубконто.Материалы).Субсчет10;
                    ТЗ.Количество = Число(Ит.СКД(3));
                    //А эти заначения будут заполняться только при снятии у субконто МестаХранения признака только количественного учета
                    ТЗ.Снд = Ит.СНД();
                    ТЗ.Скд = Ит.СКД();
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    Тз.ВыбратьСтроку();


И одно замечание: учитесь писать код красиво и понятно.

ЗЫ "Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям." (Мартин Фаулер. Рефакторинг)

Автор: roalang 5.4.2008, 10:13
Itsys  
спасибо за тескт обработки. Я давно не программировала, т.к. сижу с ребенком дома, а на работу вызвали по необходимости.

Автор: roalang 5.4.2008, 17:26
Itsys  
правильно ли я тебя поняла??? ты     Спис.ДобавитьЗначение(БИ.Субконто(ВидыСубконто.Материалы).Код);   добавляешь значение кода в список, сохраняешь это значение.
во 2ой процедуре используя БИ сравниваешь вот этой строкой  Если Спис.Принадлежит(Ит.Субконто(ВидыСубконто.Материалы).Код) = 1 Тогда значение из списка с кодом, и когда значение равно создаешь ТЗ, где выводишь результат.

Автор: Itsys 5.4.2008, 21:50
Да

Автор: roalang 7.4.2008, 04:50
чето не получается, оле мне в конечном результате, выводит одни материалы по счету 10.10.02 и все smile 

Автор: roalang 7.4.2008, 05:54
В отладчике посмотрела вот эти значания =0  
   Ит.ВыбратьСубконто(ВидыСубконто.МестаХранения);
        Пока Ит.ПолучитьСубконто(ВидыСубконто.МестаХранения) = 1 Цикл


Автор: Itsys 9.4.2008, 23:45
Ну что получилось? Я проверял на стандартной конфигурации, т.к. у тебя измененная ничего гарантировать не могу. Давай конфигурацию, тогда посмотрю, почему не работает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)