Introduktion
En av de mindre omtalade funktionerna i Odoo-datamodellen är det företagsberoende fältet. Det är en liten attribut som gör stor skillnad när du börjar arbeta med flerföretagskonfigurationer.
I de flesta Odoo-installationer har ett fält på en post ett enda värde som varje användare i databasen kan se. Men vad händer när två företag delar samma produktkatalog, och varje företag behöver sin egen interna referenskod? Eller när olika företag behöver olika standardkonton för samma produkt?
Det är precis det problemet som company_dependent-attributet löser. Oavsett om du gör Odoo-utveckling, Odoo-anpassning eller bara utforskar Odoo-ramverket, kommer förståelsen av denna fälttyp att ge dig en verklig fördel i flerföretagsprojekt.
Vad är ett företagsberoende fält i Odoo
E företagsberoende fält är ett fält som lagrar ett separat värde per företag, på samma post. När en användare som tillhör Företag A läser fältet, ser de sitt företags värde. När en användare från Företag B läser samma post, ser de ett annat värde.
Utifrån sett ser det ut och beter sig som ett normalt fält. Användare interagerar med det på samma sätt i Odoo-gränssnittet. Magin händer bakom kulisserna i Odoo ORM.
Hur det visas i gränssnittet
I Odoo UI ser ett företagsberoende fält identiskt ut som ett vanligt fält. Det finns ingen synlig indikator som berättar för en användare att det värde de ser är företags-specifikt. Detta är avsiktligt: beteendet är transparent för slutanvändare.
Ur ett utvecklarperspektiv är detta en av Odoo-fälttyperna som kan tillämpas på många bas typer: Char, Boolean, Integer, Float, Many2one, och andra. Attributet company_dependent=True är vad som aktiverar detta beteende i Odoo ORM.
I Odoo Studio är vissa företagsberoende fält redan exponerade på standardmodeller (som produktrelaterade fält för konton). Anpassade företagsberoende fält kan också skapas, även om Studio-stödet för detta specifika attribut är begränsat i vissa Odoo-versioner.
Hur fältet fungerar
Under huven fungerar företagsberoende fält mycket annorlunda än vanliga fält. Att förstå mekanismen hjälper till att undvika överraskningar när man bygger eller felsöker Odoo-anpassningar.
Lagring i ir.property
I Odoo 16 och tidigare lagras värden för företagsberoende fält inte i modellens egen databas tabell. Istället lagras de i en separat systemtabell som kallas ir.property.
Varje post i ir.property länkar:
- En specifik post (t.ex. produkt med ID 42)
- Ett specifikt fält (t.ex.
property_account_income_id) - Ett specifikt företag
- Det faktiska värdet för den kombinationen
Detta är anledningen till att värdena ser transparenta ut för användare: ORM hämtar och skriver till ir.property automatiskt baserat på den aktuella företagskontexten.
Ändringar i Odoo 17+
Från och med Odoo 17 har lagringsmekanismen omarbetats. Företagsberoende fält lagras nu direkt i modellens tabell med en jsonb-kolumn, där företagsvärden lagras som en JSON-dictionary. Detta förbättrar prestandan avsevärt och förenklar frågor.
Gränssnittet och API:t för utvecklare förblir detsamma, men frågor om företagsberoende fält är nu mycket snabbare i stor skala.
Standardvärden
Företagsberoende fält stöder företagspecifika standardvärden. När inget värde har angetts uttryckligen för ett givet företag, faller fältet tillbaka till standarden som definieras på fältet självt. Denna standard kan också ställas in per företag genom ir.property-modellen (Odoo 16 och tidigare) eller direkt på modellen (Odoo 17+).
Interaktion med ORM
I odoo orm-kontexten respekterar åtkomst till ett företagsberoende fält alltid det aktuella företaget i miljön (self.env.company). Detta innebär:
- Att läsa fältet returnerar värdet för det aktiva företaget
- Att skriva till fältet uppdaterar endast värdet för det aktiva företaget
- Att växla företagskontext (
record.with_company(company)) låter dig läsa eller skriva värden för ett specifikt företag
Affärsanvändningsfall
Det företagsberoende fältet är inte bara en teknisk nyfikenhet. Det löser verkliga, vardagliga problem i flerföretagsinställningar i Odoo. Här är fem vanliga scenarier där det verkligen förtjänar sin plats.
1. Bokföring: Företagsspecifika inkomst- och utgiftskonton
Detta är det vanligaste exemplet i Odoo direkt ur lådan. Fälten property_account_income_id och property_account_expense_id på produkter är företagsberoende.
I praktiken: Företag A säljer samma produkt som företag B, men varje företag har en annan kontoplan. Istället för att duplicera produktposten konfigurerar varje företag sina egna bokföringslinjer. Produkten delas; bokföringslogiken gör det inte.
2. Försäljning och CRM: Företagsspecifika prislistor
I en grupp som driver flera försäljningsenheter kan varje företag använda olika prissättningsstrategier. Med ett företagsberoende prislistfält kan en delad kundpost bära olika standardprislistor beroende på vilket företag som behandlar försäljningen.
Detta håller CRM-data centraliserad samtidigt som varje företag kan tillämpa sina egna kommersiella regler.
3. Lager: Företagsspecifik lagervärderingsmetod
Vissa grupper driver lager över flera juridiska enheter med olika lokala regler. En produkt kan kräva FIFO-kostnad i ett land och genomsnittlig kostnad i ett annat. Att använda företagsberoende fält på produkten eller kategorin undviker att duplicera hela produktkatalogen.
4. Tillverkning: Företagsspecifik standardleverantör
När en delad produkt köps från olika leverantörer beroende på företaget kan ett företagsberoende many2one-fält som pekar på res.partner hålla den föredragna leverantören per enhet. Varje företag ser sin egen föredragna leverantör utan några konflikter.
5. Anpassade fält för regulatoriska data
Grupper som verkar över flera länder behöver ofta lagra landspecifika efterlevnadsreferenser på delade poster. Till exempel kan en produkt behöva en annan HS-kod eller skatteklassificering per jurisdiktion. Ett företagsberoende Char-fält är ett rent, lågt overheadsätt att hantera detta utan att skapa modellvarianter.
Skapa eller anpassa fältet
Det finns två huvudsakliga sätt att skapa företagsberoende fält i Odoo: använda Odoo Studio eller skriva Python-kod direkt.
Använda Odoo Studio
Odoo Studio låter dig skapa fält utan någon kod. Men Studio exponerar inte en dedikerad växel för company_dependent i alla versioner. I Odoo 16 och 17 är alternativet tillgängligt för vissa fälttyper när nya fält skapas på standardmodeller.
Om du behöver full kontroll över denna egenskap är teknisk utveckling det mer pålitliga tillvägagångssättet. Studio är en bra utgångspunkt för enklare fall, men det har begränsningar när det gäller avancerade Odoo-anpassningsscenarier.
Tekniskt tillvägagångssätt: Python-fält
I en anpassad Odoo-modul är det enkelt att deklarera ett företagsberoende fält. Detta är det standardmönster som används i Odoo Python-fältutveckling:
from odoo import fields, models
class ProductTemplate(models.Model):
_inherit = 'product.template'
x_internal_ref = fields.Char(
string='Intern referens (per företag)',
company_dependent=True,
)
x_preferred_carrier_id = fields.Many2one(
comodel_name='res.partner',
string='Föredragen transportör',
company_dependent=True,
)
Att lägga till company_dependent=True i vilken fältdeklaration som helst är allt som krävs. ORM hanterar resten automatiskt.
Ställa in standardvärden per företag
I Odoo 16 och tidigare kan du ställa in ett företagsnivåstandard via ir.property-modellen. Detta är användbart när du vill ha ett rimligt standardvärde för alla poster i ett företag, utan att ställa in det post för post:
self.env['ir.property']._set_default(
'x_internal_ref',
'product.template',
'DEFAULT-VALUE',
company_id=self.env.company.id,
)
I Odoo 17+ lagras standardvärdet direkt på modellposten och är också tillgängligt via fältdefinitionen.
Odoo Studio Fält och Begränsningar
När du arbetar med Odoo Studio-fält, kom ihåg att x_-prefixet är obligatoriskt för anpassade fält. Företagsberoende beteende kanske inte syns i Studio-användargränssnittet, men det kan fortfarande konfigureras från den tekniska menyn under Inställningar om utvecklarläge är aktivt.
Bästa praxis
Att arbeta med företagsberoende fält är enkelt när du känner till mönstren. Här är de metoder som sparar tid och förhindrar huvudvärk.
1. Använd det endast när värden verkligen skiljer sig mellan företag
Företagsberoende fält lägger till komplexitet. Om värdet är detsamma för alla företag, använd ett vanligt fält. Reservera company_dependent=True för fält där olika företag verkligen behöver olika värden på delade poster.
2. Testa alltid i en flerföretagskontext
När du bygger eller testar funktioner som involverar företagsberoende fält, testa alltid med minst två aktiva företag. Det är lätt att missa problem i en enskild företagsinställning som omedelbart kommer att synas i produktion.
3. Använd with_company() för tvärföretagsoperationer
Om din kod behöver läsa eller skriva värden för företagsberoende fält för ett företag annat än det aktuella, använd record.with_company(target_company). Undvik att manuellt byta miljöföretag utan att återställa det.
4. Var försiktig med export och import
När du exporterar poster som innehåller företagsberoende fält, återspeglar de exporterade värdena företaget för användaren som gör exporten. Att importera samma fil under en annan företagskontext kommer att ställa in värdena för det företaget. Detta är ofta det korrekta beteendet, men var tydlig med det i migrations- och dataimportarbetsflöden.
5. Dokumentera Vilka Fält Som Är Företagsberoende
Slutanvändare vet sällan vilka fält som är företagsberoende. En kort anteckning i din interna Odoo-dokumentation eller onboardingmaterial gör stor skillnad. Det förhindrar förvirring när en användare byter företag och ser olika värden på samma post.
6. Föredra Many2one Framför Char för Strukturerad Data
När värdet per företag är en referens till en annan post (konto, prislista, partner), använd ett Many2one företagsberoende fält istället för att lagra ett namn som text. Detta håller datamodellen ren och gör rapportering mer pålitlig.
Vanliga fallgropar
Även erfarna Odoo-utvecklare stöter på problem med företagsberoende fält. Att veta vad man ska se upp för kommer att förhindra bortkastad felsökningstid.
Fälla 1: Att Glömma Företagskontexten i Automatiserade Åtgärder
Schemalagda åtgärder och serveråtgärder körs ofta i en kontext där företaget är det första företaget i databasen, inte nödvändigtvis det du förväntar dig. Om din automatiserade åtgärd läser eller skriver ett företagsberoende fält, verifiera företagskontexten explicit. Använd with_company() för att vara säker.
Fälla 2: Att Anta Att Fältet Beter Sig Som Ett Beräknat Fält
Företagsberoende fält är inte beräknade fält. De har ingen compute-metod. Variationerna per företag kommer från lagring, inte beräkning. Att försöka lägga till compute= tillsammans med company_dependent=True kommer inte att fungera som förväntat och kan orsaka fel i Odoo-ramverket.
Fälla 3: Söka Över Företag
Standard ORM-sökningar på företagsberoende fält returnerar endast resultat som matchar den aktuella företagskontexten. Om du behöver söka över alla företag, måste du fråga ir.property direkt (Odoo 16 och tidigare) eller hantera jsonb-kolumnen noggrant (Odoo 17+). Detta är en vanlig källa till förvirring i rapportering och datautvinningsarbete.
Fallgrop 4: Att inte ställa in standardvärden för alla företag
När du introducerar ett företagsberoende fält i ett aktivt system kommer befintliga poster att returnera False eller None för alla företag som inte uttryckligen har ställt in ett värde. Om din affärslogik förväntar sig en standard, ställ in den proaktivt för alla relevanta företag med hjälp av ett datamigreringsskript.
Fallgrop 5: Att förväxla det med åtkomsträttigheter
Företagsberoende fält kontrollerar vilket värde som visas, inte huruvida användaren kan se fältet överhuvudtaget. Om du behöver dölja ett fält helt för vissa företag eller användare, är det en uppgift för postregler eller åtkomsträttigheter på fältnivå, inte company_dependent.
Slutsats
Det företagsberoende fältet är en av de funktioner i Odoo som känns osynlig tills du behöver den, och då blir den oumbärlig. Det är rätt verktyg för alla situationer där samma post behöver bära olika värden över företag: redovisningskonfigurationer, prissättningsregler, regulatoriska referenser eller något affärsspecifikt attribut som varierar beroende på juridisk enhet.
Att förstå hur det fungerar på ORM-nivå, vilken version av Odoo som ändrade lagringsmodellen och vilka fallgropar som ska undvikas kommer att spara dig betydande tid på projekt med flera företag. Oavsett om du stöter på det i en standard Odoo utvecklarmanual eller upptäcker det medan du felsöker ett aktivt system, är kunskap om denna fälttyp ett kännetecken för verklig Odoo-expertis.
Om du bygger på Odoo-ramverket och behöver hantera företagsdata på ett rent sätt, är company_dependent=True svaret du har letat efter.
Behöver du hjälp med din Odoo-implementering?
På Dasolo hjälper vi företag att implementera, anpassa och optimera Odoo i alla skala och konfigurationer, inklusive komplexa flerföretagsuppsättningar. Oavsett om du behöver en skräddarsydd datamodell, en anpassad fältstrategi eller en fullständig Odoo-utrullning, har vårt team den tekniska och funktionella djupet för att få det rätt.
Om du har frågor om företagsberoende fält eller någon annan aspekt av din Odoo-implementation, hjälper vi gärna till. Kontakta oss och låt oss prata om vad du bygger.